2013-04-27 13 views
5

I zdefiniowany styl w ResourceDictionary na przycisk z obrazka:WPF UserControls: Obraz znika nawet z „x: Shared =«false»”

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

Obraz źródłowy jest zdefiniowana w innym ResourceDictionary w sam montaż i oznaczone jako x:Shared="False":

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

Ponieważ styl zostaną wykorzystane w innym zespole, użyłem notacji "pack://application:,,," odwołać obraz. Numer Build Action dla obrazu jest ustawiony na Resource (Do not copy to output directory).

W głównym zespole Mam dwie UserControls który wyświetlany przycisk z identycznym stylu:

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

PROBLEM:

otworzyć UserControl A zawierający przycisk z obrazem, a obraz wyświetlany jest ok . Następnie otwieram UserControl B zawierający identyczny przycisk, obraz ok. Ponownie otwieram UserControl A, a obraz zniknął. Zdarza się to samo, gdy otwieram UserControl B, a następnie UserControl A, ostatni "jest właścicielem" obrazu.

Poszedłem wszędzie, a wszystkie rozwiązania wskazują na x:Shared="False", URI notation i Build Action ... Zastosowałem je wszystkie i problem nadal się pojawia. Próbowałem też czyścić i odbudowywać bez powodzenia.

Czego mi brakuje? Dzięki!

PS: jeśli ustawię zawartość obu przycisków bezpośrednio na obrazie, działa dobrze, ale cały styl stylizacji polega na uniknięciu tego!

Odpowiedz

10

Problem nie jest BitmapImage jest to zawartość w ustawiaczu przycisku - jest tworzony raz i dlatego musi "przeskakiwać" między instancjami.

Łatwe, ale nie działające w trybie WPF rozwiązanie polega na ustawieniu stylu x:Shared="False".

Prawidłowym sposobem jest użycie ControlTemplate lub DataTemplate.

Od swoimi obserwacjami:

jeśli ustawić zawartość obu przycisków do obrazu bezpośrednio działa ok” - to dlatego, aby zrobić to utworzyć dwa różne instancje Image obiektu.

Ale, to: "cały styl stylizacji polega na uniknięciu tego!" to błędne przekonanie - style nie mają na celu ustawienia treści kontroli treści, treść zależy od kontekstu. Jeśli masz wizualizację powtarzającą się dla wszystkich przycisków (bez zależności od zawartości), powinien on znajdować się w numerze ControlTemplate dla przycisku. Jeśli masz wizualizację zależną od treści (ale treść nie jest wizualna), powinna ona znajdować się w DataTemplate.

+0

Dziękujemy za przesłanie rozwiązania, masz absolutną rację w swoich komentarzach. – Hannish