2010-11-04 57 views
16

我有一个窗口与背景图像。图像可能会在运行时发生变化,这对于此确实不重要。我想让图像固定在左上方(它是),而不是缩放(这也是正确的,但是当窗口大于图像时,我需要图像重复(平铺)。我做...WPF窗口背景ImageBrush不平铺

我失去了什么?

TIA

回答

39

您需要设置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属性的第二2段表示每个重复的所需尺寸。如果你想显示整个图像,这些应该是图像的宽度和高度。

输出示例:响应意见 tiled magnifiers

编辑

如果你不知道在Viewport属性来指定图像的大小,你可以使用一个BindingIValueConverter从图像中计算出来。我相信这样做一定有更好的方法,但我还没有找到一个!

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 
} 
+0

我 - <图像刷弹力=“None”AlignmentX =“Left”AlignmentY =“Top”ImageSource =“/ Panel; component/Images/woodpine.jpg”TileMode =“Tile”/> 但它不起作用 – Jeff 2010-11-04 14:30:49

+0

@Jeff - 我以前没有见过这个,但你需要设置Viewport和ViewportUnits - 我已经更新了答案以反映这个 – 2010-11-04 14:45:29

+0

(+1)比我的,仍然使用ImageBrush。 – 2010-11-04 14:51:29

4

如果你想在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; 
+0

我知道这个问题很老。只需发布一个可能的后端解决方案。 – Milne 2014-04-10 19:52:11