WPF窗口背景ImageBrush不平铺

我有一个带有背景图像的窗口。图像可能会在运行时发生变化,这对于此而言并不重要。

我想要将图像固定在左上角(它是),而不是缩放(这也是正确的,但是当窗口大于图像时,我需要图像重复(瓦片),我在做… 。


我失踪了什么

TIA

您需要设置 TileMode属性以及Viewport和ViewportUnits:

例如:

<Window.Background>
    <ImageBrush ImageSource="myImage.png"
        Viewport="0,300,300"
        ViewportUnits="Absolute"
        TileMode="Tile"
        Stretch="None"
        AlignmentX="Left"
        AlignmentY="Top"  />
</Window.Background>

注意:Viewport属性的第二个2段表示每个重复的所需大小。如果要显示整个图像,这些应该是图像的宽度和高度。

示例输出

编辑响应评论

如果您不知道要在“视口”属性中指定的图像的大小,则可以使用带有IValueConverter的绑定从图像中计算。我确信必须有一个更好的办法,但我还没有找到一个

XAML:

<Window.Resources>
    <local:Converter x:Key="Converter" />
</Window.Resources>
<Window.Background>

    <ImageBrush ImageSource="myImage.png"
    ViewportUnits="Absolute"
    TileMode="Tile"
    Stretch="None"
    AlignmentX="Left"
    AlignmentY="Top" 
    Viewport="{Binding ImageSource,RelativeSource={RelativeSource Self},Converter={StaticResource Converter}}"/>
</Window.Background>

价值转换器

public class Converter : IValueConverter
{
    #region IValueConverter Members

    public object Convert(object value,Type targettype,object parameter,System.Globalization.CultureInfo culture)
    {
        var source = (ImageSource)value;
        return new Rect(0,source.Width,source.Height);
    }

    public object ConvertBack(object value,System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    #endregion
}

相关文章

Windows注册表操作基础代码 Windows下对注册表进行操作使用的...
黑客常用WinAPI函数整理之前的博客写了很多关于Windows编程的...
一个简单的Windows Socket可复用框架说起网络编程,无非是建...
Windows文件操作基础代码 Windows下对文件进行操作使用的一段...
Winpcap基础代码 使用Winpcap进行网络数据的截获和发送都需要...
使用vbs脚本进行批量编码转换 最近需要使用SourceInsight查看...