【问题标题】:WPF image that stretches and crops可拉伸和裁剪的 WPF 图像
【发布时间】:2013-12-28 14:57:39
【问题描述】:

我想要一张图片作为网格的背景。默认情况下,图像应右对齐和下对齐。图像还应该均匀地拉伸到容器的高度。但是,如果容器的大小调整为宽度小于图像的大小,则图像开始调整大小以变得更小。而不是发生这种情况,我想剪辑图像,以便从右侧开始隐藏部分。

这是我现在的图像 XAML:

<Image Source="blahblah.png"
       HorizontalAlignment="Right" 
       VerticalAlignment="Bottom" 
       Stretch="Uniform" />

这是我想要在图片中描述的行为(黑色边框是容器大小):

【问题讨论】:

    标签: wpf image xaml crop


    【解决方案1】:

    尝试混合使用不同的面板,如下所示:

    <Grid x:Name="mainGrid" >
    
        <Grid x:Name="backgroundSpacer" HorizontalAlignment="Stretch" 
              MinWidth="{Binding ElementName=backgroundImage, Path=ActualWidth}" >
            <StackPanel x:Name="backgroundPanel" 
                        HorizontalAlignment="Right" Orientation="Horizontal" >
                <Image x:Name="backgroundImage" Stretch="Fill" 
                       Source="http://programming.enthuses.me/1.png" />
            </StackPanel>
        </Grid>
    
        ... 
    
    </Grid>
    

    在这里,我们将图像放在水平(并右对齐)StackPanel。 StackPanel 默认垂直拉伸,StackPanel 的一个特点是它告诉它的子项它们有无限的宽度。因此,Image 总是尽可能地呈现为 tall

    接下来,我们有一个“backgroundSpacer”,它通常延伸到整个容器网格,但通过MinWidth 绑定,我们确保它总是足够宽以容纳整个图像。如果“mainGrid”变得太薄,“backgroundSpacer”会被剪掉,WPF 的默认剪裁行为会从其右侧剪掉。

    【讨论】:

    • 老兄,完美!谢谢一堆。另外,我一直认为 WPF 不能在绑定表达式中引用子元素...哎呀。
    【解决方案2】:

    我也看不到仅通过设置一些“魔术”属性的方法。我将实现一个面板来托管您的图像并管理所需的行为(缩放和定位)。这就是面板的样子:

        public class ImagePanel : Panel
    {
        public ImagePanel ()
        {
        }
    
        protected override Size MeasureOverride (Size availableSize)
        {
            if (InternalChildren.Count > 0)
            {
                FrameworkElement child = (FrameworkElement)InternalChildren[0];
    
                var childMaxSize = new Size (double.PositiveInfinity, availableSize.Height);
                child.Measure (childMaxSize);
            }
    
            return availableSize;
        }
    
        protected override Size ArrangeOverride (Size finalSize)
        {
    
            if (InternalChildren.Count > 0)
            {
                FrameworkElement child = (FrameworkElement)InternalChildren[0];
    
                double x = finalSize.Width - child.DesiredSize.Width;
    
                if (x < 0)
                {
                    x = 0;
                }
    
                child.Arrange (new Rect (new Point (x, 0), child.DesiredSize));
            }
    
            return finalSize; // Returns the final Arranged size
        }
    }
    

    这样使用:

        <local:ImagePanel>
          <Image Source="Image.jpg" Fill="Uniform"/>
        </local:ImagePanel>
    

    【讨论】:

      【解决方案3】:

      您是否尝试过使用 ViewBox 元素?将其放在仅定义 MaxWidth/Width 的父级上,并将 ClipToBounds 设置为 True。有关此控件的更多信息(这在我们谈论调整大小时很有帮助):

      http://msdn.microsoft.com/pt-br/library/system.windows.controls.viewbox(v=vs.110).aspx

      【讨论】:

      • 我试试看。不知道谁投了反对票以及为什么他们没有发表评论。
      猜你喜欢
      • 2012-10-31
      • 1970-01-01
      • 2011-02-07
      • 2017-05-08
      • 1970-01-01
      • 2014-10-20
      • 1970-01-01
      • 2011-01-31
      相关资源
      最近更新 更多