我有一个有背景图像的窗口。图像可能会在运行时发生变化,这对此并不重要。
我希望图像被固定在左上角(这是),而不是缩放(这也是正确的。但是当窗口比图像大时,我需要图像重复(平铺)。我正在做..。
我遗漏了什么?
提亚
发布于 2010-11-04 22:11:19
您需要设置TileMode属性以及Viewport和ViewportUnits
例如:
<Window.Background>
<ImageBrush ImageSource="myImage.png"
Viewport="0,0,300,300"
ViewportUnits="Absolute"
TileMode="Tile"
Stretch="None"
AlignmentX="Left"
AlignmentY="Top" />
</Window.Background>注意:Viewport属性的后两个片段表示每次重复所需的大小。如果您想要显示整个图像,这些应该是图像的宽度和高度。
输出示例:

对评论的响应编辑
如果不知道要在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
}发布于 2014-04-11 03:50:37
如果您希望在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;https://stackoverflow.com/questions/4097330
复制相似问题