WPF窗口背景ImageBrush没有平铺

Jef*_*eff 17 wpf background window

我有一个带有背景图像的窗口.图像可能会在运行时发生变化,这对此无关紧要.

我希望图像固定在左上角(它是)而不是缩放(这也是正确的.但是当窗口比图像大时,我需要重复(平铺)图像.我正在做... .

我错过了什么?

TIA

Ste*_*rex 41

您需要设置TileMode属性以及ViewportViewportUnits:

例如:

<Window.Background>
    <ImageBrush ImageSource="myImage.png"
        Viewport="0,0,300,300"
        ViewportUnits="Absolute"
        TileMode="Tile"
        Stretch="None"
        AlignmentX="Left"
        AlignmentY="Top"  />
</Window.Background>
Run Code Online (Sandbox Code Playgroud)

注意:Viewport属性的后两个段表示每次重复的所需大小.如果要显示整个图像,则应该是图像的宽度和高度.

示例输出: 平铺放大镜

编辑以回应评论

如果您不知道要在Viewport属性中指定的图像大小,可以使用a Binding和a 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>
Run Code Online (Sandbox Code Playgroud)

价值转换器:

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,0,source.Width, source.Height);
    }

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

    #endregion
}
Run Code Online (Sandbox Code Playgroud)


Mil*_*lne 5

如果您想要使用C#的完整解决方案

ImageBrush brush = new ImageBrush();
brush.ImageSource = new BitmapImage(new Uri(@"c:\your\image\source.gif"));
brush.TileMode = TileMode.Tile;
brush.ViewportUnits = BrushMappingMode.Absolute;
brush.Viewport = new Rect(0, 0, brush.ImageSource.Width, brush.ImageSource.Height);

MainWindow1.Background = brush;
Run Code Online (Sandbox Code Playgroud)