2013-04-27 69 views
5

我定義在一個ResourceDictionary一個樣式用於與圖像的按鈕:WPF用戶控件:圖像中消失,即使「×:共享=‘假’」

<Style x:Key="BotonIrAInicioStyle" TargetType="Button"> 
    <Setter Property="Margin" Value="0"/> 
    <Setter Property="Width" Value="{Binding RelativeSource={RelativeSource Self}, Path=ActualHeight}"/> 
    <Setter Property="Content"> 
     <Setter.Value> 
      <Image Margin="2" Source="{StaticResource IconoDashboardBlanco}" MaxHeight="20" Stretch="Uniform" 
        RenderOptions.BitmapScalingMode="HighQuality"/> 
     </Setter.Value> 
    </Setter> 
</Style> 

的圖像源在另一個ResourceDictionary限定在相同的組件,並標記爲x:Shared="False"

<BitmapImage x:Key="IconoDashboardBlanco" x:Shared="False" 
UriSource="pack://application:,,,/QualityFramework;component/Images/dashboard64X64.png"/> 

由於樣式將在不同的組件一起使用,我用"pack://application:,,,"符號引用圖像。圖像的Build Action設置爲Resource (Do not copy to output directory)

在主組件我有兩個UserControls其中顯示具有相同樣式的按鈕:

<Button DockPanel.Dock="Left" Style="{StaticResource BotonIrAInicioStyle}" Click="BotonIrAInicio_Click"/> (Click event has nothing to do with the problem) 

問題:

我打開包含與所述圖像和所述圖像的按鈕UserControl A顯示OK 。然後我打開包含相同按鈕的UserControl B,圖像正常。我再次打開UserControl A,圖像消失了。如果我打開UserControl B,然後UserControl A,最後一個「擁有」圖像,會發生同樣的情況。

我去了無處不在,所有的解決方案指向x:Shared="False"URI notationBuild Action ......我應用了所有這些問題,問題仍然存在。我也嘗試清潔和重建沒有成功。

我錯過了什麼?謝謝! PS:如果我將兩個按鈕的內容直接設置到圖像上,它就可以正常工作,但整體造型的目的是爲了避免這種情況!

回答

10

問題不在於BitmapImage它是按鈕設置者的內容 - 它只創建一次,因此必須在實例之間「跳躍」。

簡單但不是WPF-isque的解決方案是在樣式上設置x:Shared="False"

正確的方法是使用ControlTemplateDataTemplate

從你的觀察:

如果我兩個按鈕的內容設置到圖像直接它的工作原理確定」 - 這是因爲這樣做,你創建Image對象的兩個不同的實例。

但是,這個:「整體造型風格就是爲了避免這一點!」是一種誤解 - 風格並不意味着設置內容控件的內容,內容依賴於上下文。如果您有一個對所有按鈕重複的視覺效果(不依賴於內容),它應該位於該按鈕的ControlTemplate中。如果您的視覺效果依賴於內容(但內容不是視覺效果),則它應該位於DataTemplate中。

+0

感謝您發佈解決方案,您在評論中絕對正確。 – Hannish 2013-04-28 16:31:30