2011-04-25 85 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