我的UserControl
有一个重复图像背景,其代码如下:
<UserControl.Background>
<ImageBrush ImageSource="Resources/image.jpg" Viewport="0,0,32,32" ViewportUnits="Absolute" TileMode="Tile" Stretch="None" AlignmentX="Left" AlignmentY="Top" />
</UserControl.Background>
它工作正常。然而,问题是平铺图像源自控件的顶部,因此如果控件垂直调整大小,背景的新可见部分似乎从控件的底部出来。
我希望图像从底部到顶部而不是从顶部到底部平铺,以便在调整控件大小时,新显示的背景来自顶部,而不是底部
我该怎么做?我尝试将AlignmentY
设置为Bottom
,但它没有改变任何内容。
答案 0 :(得分:2)
好的,这可能不是你想要的,但我发现你的问题非常有趣。
我能够水平地进行(新图像从左侧而不是右侧出现) 通过在用户控件上将“FlowDirection”设置为“RightToLeft”,它将执行您需要的HORIZONTALLY。我不知道这是否可以垂直。我还在调查它......
<Canvas FlowDirection="RightToLeft">
<Canvas.Background>
<ImageBrush ImageSource="Resources/image.jpg" Viewport="0,0,32,32" ViewportUnits="Absolute" TileMode="Tile" Stretch="None" AlignmentX="Left" AlignmentY="Bottom" />
</Canvas.Background>
</Canvas>
这是我的UserControl的第一个元素,但是这个“FlowDirection”可以放在用户控件根目录的基本元素(通常是Grid)上。但是,使用画布,您可以确保此“流向”不会影响用户控件中的任何其他组件。
希望这能指明你的方向。
- 编辑 -
大声笑我不敢相信这有效,但确实如此!基于我的第一部作品,并使用转换器作为画布的边距:
转换器:
[ValueConversion(typeof(double), typeof(Thickness))]
public class SizeToInverseMarginConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (targetType != typeof(Thickness))
throw new InvalidOperationException("The target must be of type 'Thickness'");
double vNewVal = -5000 + (double)value;
return new Thickness(0, vNewVal, 0, 0);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotSupportedException();
}
}
然后是用户控件的内容:
<UserControl.Resources>
<My:SizeToInverseMarginConverter x:Key="s2m" />
</UserControl.Resources>
<Grid x:Name="MainGrid">
<Canvas FlowDirection="RightToLeft" Margin="{Binding Path=ActualHeight, ElementName=MainGrid, Converter={StaticResource s2m}}">
<Canvas.Background>
<ImageBrush ImageSource="Resources/image.jpg" Viewport="0,0,32,32" ViewportUnits="Absolute" TileMode="Tile" Stretch="None" AlignmentX="Left" AlignmentY="Bottom" />
</Canvas.Background>
</Canvas>
</Grid>