WPF窗口背景ImageBrush不平铺

21
我有一个带有背景图像的窗口。图像可能会在运行时更改,但这实际上不应该影响到它。
我想让图像固定在左上角(已经是这样了),并且不缩放(也是正确的)。但当窗口的大小大于图像时,我需要图像重复(平铺)显示。我正在做...
我缺少什么?
先行感谢!
2个回答

47

你需要设置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>
注意:Viewport属性的第二个和第三个部分指示每次重复的所需大小。如果您想要显示整个图像,则应该是图像的宽度和高度。
示例输出: tiled magnifiers 根据评论进行编辑:
如果您不知道在Viewport属性中指定的图像大小,可以使用具有IValueConverter的Binding来计算它。我相信一定有更好的方法可以做到这一点,但我尚未找到!
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,0,source.Width, source.Height);
    }

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

    #endregion
}

1
我是 - <Window.Background> <ImageBrush Stretch="None" AlignmentX="Left" AlignmentY="Top" ImageSource="/Panel;component/Images/woodpine.jpg" TileMode="Tile" /> </Window.Background>,但它不起作用。 - Jeff
不起作用。对于16x16像素图像是可以的,但是我的150x150像素图像被缩小到原始大小的约50%,因此屏幕区域的3/4都是白色的。 - ygoe
有没有人(@Jeff或其他人)能告诉我,为什么如果我尝试使用相同的代码来设置网格或画布背景时它不起作用?我的意思是不使用窗口背景。 - Manish Dubey
@ManishDubey 网格或画布是否会拉伸以填充其容器? - Steve Greatrex
抱歉!我错了。现在它也适用于画布。 - Manish Dubey
显示剩余9条评论

8
如果您想要完整的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;

我知道这个问题很久了。只是发布一个可能的后端解决方案。 - Milne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接