2011-04-25 82 views
3

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

  1. 要创建一个Border如果 图像0​​提供,或LinearGradientBrush如果不适用ImageBrush边境Background财产。这很容易 实现:视图模型将提供边界背景属性或图像 画笔或线性渐变画笔。但是有一个大问题:如果图像尺寸 不符合边框尺寸,则图像会变形,这是我希望避免的。是 有一种方法来设置ImageBrush并保持图像尺寸比例,即 应用类似Stretch = Stretch.Uniform

  2. 在里面创建一个Border和一个Image。然后,要创建一个数据触发 边界,如果图像Uri(从视图模型的属性)是null,设置 边框的BackgroundLinearGradientBrush并让它空白,如果 否则。我试图创建这个,但数据触发器从来不理解null 的情况。 Image也有问题,因为如果nullImageSource属性提供,则会引发异常。代码如下所示:

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

什么是最好的,以实现这样的功能最简单的方法?谢谢。

回答

1

ImageBrush源自TileBrush类,该类具有Stretch属性。所以你可以使用不像Stretch = Stretch.Uniform,但确切的说。

+0

哈,它似乎我错过了它的属性列表(http://msdn.microsoft.com/en-us/library/system.windows.media.imagebrush.aspx)。谢谢丹尼斯! – Boris 2011-04-25 14:12:49