2013-04-27 21 views
5

ho definito uno stile in un ResourceDictionary per un pulsante con un'immagine:UserControls WPF: immagine scompare anche con '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> 

La fonte immagine viene definita in un altro ResourceDictionary nel stesso insieme, ed è indicata come x:Shared="False":

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

poiché lo stile sarà utilizzato in un gruppo diverso, ho usato la notazione "pack://application:,,," per indicare l'immagine. Lo Build Action per l'immagine è impostato su Resource (Do not copy to output directory).

Nel complesso principale ho due UserControls che mostrano un pulsante con identico stile:

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

PROBLEMA:

apro UserControl A contenente il pulsante con l'immagine e l'immagine viene visualizzata ok . Quindi apro UserControl B contenente un pulsante identico, immagine ok. Apro di nuovo UserControl A e l'immagine è sparita. Accade lo stesso se apro UserControl B e poi UserControl A, l'ultimo "possiede" l'immagine.

Sono andato dappertutto e tutte le soluzioni indicano il x:Shared="False", lo URI notation e lo Build Action ... Ho applicato tutte e il problema si verifica ancora. Ho anche provato a pulire e ricostruire senza successo.

Cosa mi manca? Grazie!

PS: se imposto direttamente il contenuto di entrambi i pulsanti sull'immagine, tutto va bene, ma l'intero punto dello stile è quello di evitare esattamente quello!

risposta

10

Il problema non è il BitmapImage è il contenuto nel setter del pulsante - è stato creato una volta e quindi deve "saltare" tra le istanze.

La soluzione semplice, ma non WPF-isque, sta impostando x:Shared="False" sullo stile.

Il modo corretto è utilizzare ControlTemplate o DataTemplate.

Da vostre osservazioni:

"se ho impostato il contenuto di entrambi i pulsanti per l'immagine direttamente funziona bene" - questo è perché per farlo si creano due istanze diverse di Image oggetto.

Ma, questo: "il punto di stile è quello di evitare esattamente questo" è un equivoco - stili non sono stati pensati per impostare il contenuto dei controlli del contenuto, il contenuto dipende dal contesto. Se hai un'immagine che si ripete per tutti i pulsanti (senza dipendere dal contenuto), dovrebbe risiedere nel pulsante ControlTemplate. Se si dispone di un'immagine che dipende dal contenuto (ma il contenuto non è visivo) deve risiedere in DataTemplate.

+0

Grazie per aver postato una soluzione, hai assolutamente ragione nei tuoi commenti. – Hannish

Problemi correlati