首页 文章

WPF图像,拉伸和作物

提问于
浏览
0

我想要一个图像作为网格的背景 . 默认情况下,图像应该是右对齐和底对齐的 . 图像也应均匀地拉伸到容器的高度 . 但是,如果容器调整大小使得宽度比图像的大小更薄,则图像开始调整大小以变小 . 而不是发生这种情况,我想剪辑图像,使右边的部分开始隐藏 .

这是我的图像XAML现在:

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

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

Cropping behavior

3 回答

  • 3

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

    <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 始终呈现为尽可能高 .

    接下来,我们有一个"backgroundSpacer",它通常在整个容器网格中延伸,但是通过 MinWidth 绑定,我们确保它总是足够宽以包含整个图像 . 如果"mainGrid"太薄,"backgroundSpacer"会被剪裁,而WPF的默认剪切行为会从右侧剪切掉 .

  • -1

    我没有看到一种方法,只是设置一些“魔术”属性 . 我将实现一个托管您的图像并管理所需行为(缩放和定位)的面板 . 这就是面板的样子:

    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>
    
  • 1

    你有没有尝试使用ViewBox元素?将它放在仅定义了MaxWidth / Width的Parent上,并将ClipToBounds设置为True . 有关此控件的更多信息(当我们谈论调整大小时,这有很多帮助):

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

相关问题