【问题标题】:"Pinning" a background to the bottom of a control将背景“固定”到控件底部
【发布时间】:2012-07-18 15:03:39
【问题描述】:

我有一个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,但并没有改变任何事情。

【问题讨论】:

    标签: c# wpf background tiles


    【解决方案1】:

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

    我能够横向进行(新图像从左侧显示,而不是从右侧显示)。
    通过在您的用户控件上将“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>
    

    【讨论】:

    • 感谢您的调查,但是我对背景的水平锚点没有任何要求,只有垂直,所以不要让这妨碍您提供仅适用于垂直的解决方案(因为这就是我所需要的)。
    • LOL 别担心,我还在尝试,但它根本不起作用......我现在实际上正在尝试将 Canvas 的边距与转换器绑定,这样,作为您调整控件的大小,画布的边距顶部和左侧的大小增加的反差:例如。如果将高度从 200px 调整为 300px,则画布的边距将为“-100,-100,0,0”。不幸的是,我对转换器不是很熟悉,所以需要更多时间......
    猜你喜欢
    • 2013-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-24
    • 2013-05-12
    相关资源
    最近更新 更多