WPF窗口背景ImageBrush没有平铺

时间:2010-11-04 13:53:20

标签: wpf background window

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

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

             

我缺少什么?

TIA

2 个答案:

答案 0 :(得分:40)

您需要设置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属性中指定的图片大小,可以使用带有Binding的{​​{1}}从图片中进行计算。我确信必须有更好的方法来做到这一点,但我还没有找到一个!

XAML:

IValueConverter

价值转换器:

<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>

答案 1 :(得分: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;