WPF:处理图像

时间:2011-04-25 09:03:02

标签: wpf xaml

我想创建以下功能:我希望能够在窗口上显示图像(如果已提供),或者如果图像不存在则显示线性渐变画笔。我提出了两种方法:

  1. 创建Border并将ImageBrush应用于边境Background属性 提供了图片Uri,如果没有,则为LinearGradientBrush。这很容易 实现:视图模型将提供带有图像的边框背景属性 刷或线性渐变刷。但是有一个大问题:如果图像尺寸 不适合边框尺寸,图像变形,这是我希望避免的。是 有一种方法来设置ImageBrush并保持图像尺寸比,即 应用类似Stretch = Stretch.Uniform的内容?

  2. 在其中创建BorderImage。然后,为其创建数据触发器 边框,如果图像Uri(视图模型中的属性)为null,则设置 Background边框的LinearGradientBrush,如果是,请将其留空 除此以外。我试过创建它,但数据触发器永远不会理解null 案件。 Image也存在问题,因为如果提供了null ImageSource属性,抛出异常。代码如下所示:

    <Border Width="130" Height="170">
      <Border.Style>
        <Style TargetType="Border">
          <Style.Triggers>
            <DataTrigger Binding="{Binding Image}" Value="{x:Null}">
              <Setter Property="Background">
                <Setter.Value>
                  <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
                    <GradientStop Color="#696969" Offset="0.0" />
                    <GradientStop Color="#2E2E2E" Offset="1.0" />
                  </LinearGradientBrush>
                </Setter.Value>
              </Setter>
            </DataTrigger>
          </Style.Triggers>
        </Style>
      </Border.Style>
      <Image Name="image" Stretch="Uniform">
        <Image.Source>
          <BitmapImage 
              DecodePixelWidth="{Binding ElementName=image, Path=Width}" 
              UriSource="{Binding Path=Image}" />
        </Image.Source>
      </Image>
    </Border>
    
  3. 实现此类功能的最佳和最简单的方法是什么?感谢。

1 个答案:

答案 0 :(得分:1)

ImageBrush派生自TileBrush类,其具有Stretch属性。所以你不能使用像Stretch = Stretch.Uniform这样的东西,而是使用{。}}。