1

我有一个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>

它工作正常。但是,问题在于平铺图像来自控件的顶部,因此如果垂直调整控件的大小,背景的新可见部分似乎会从控件的底部出来。

我希望图像从底部到顶部而不是从顶部到底部平铺,以便在调整控件大小时,新可见的背景来自顶部,而不是底部

我怎样才能做到这一点?我试过设置AlignmentYBottom但它没有改变任何事情。

4

1 回答 1

2

好的,这可能不是你要找的,但我发现你的问题很有趣。

我能够水平地做到这一点(新图像从左侧出现,而不是从右侧出现)。
通过在您的用户控件上将“FlowDirection”设置为“RightToLeft”,它将执行您需要的水平操作。我不知道这是否可能垂直。我还在研究中......

    <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”可以放置在用户控件根目录的基本元素(通常是网格)上。但是,使用画布,您可以确保此“流向”不会影响用户控件中的任何其他组件。

希望这能为您指明一个好的方向。

- 编辑 -

大声笑我不敢相信这有效,但它确实有效!基于我的第一个工作,并使用转换器作为画布的边距:

转换器:

    [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>
于 2012-07-18T16:26:25.030 回答