2013-05-21 6 views
9

Vorrei impostarea Path definito in Resources. Così ho creato UserControl, definito Path, due Brushes e pulsante Style in risorse ... e tutto era ok.Percorso dalle risorse come contenuto del pulsante

<UserControl ...> 
    <UserControl.Resources> 
     <Path x:Key="PageSmallIcon2" Stretch="Fill" Fill="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Control}}, Path=Foreground}" Stroke="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Control}}, Path=Foreground}" SnapsToDevicePixels="True" Data="F1 M 19,25L 27,25L 27,33L 19,33L 19,25 Z M 19,36L 27,36L 27,44L 19,44L 19,36 Z M 31,25L 57,25L 57,33L 31,33L 31,25 Z M 19,47L 27,47L 27,55L 19,55L 19,47 Z "/> 
     <SolidColorBrush x:Key="MainColorBrush2" Color="Orange"/> 
     <SolidColorBrush x:Key="WhiteColorBrush2" Color="WhiteSmoke"/> 
     <Style x:Key="TransparentButtonStyle2" TargetType="{x:Type Button}"> 
      <Setter Property="Foreground" Value="{StaticResource WhiteColorBrush2}"/> 
      <Setter Property="Height" Value="25"/> 
      <Setter Property="Width" Value="25"/> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type Button}"> 
         <Grid> 
          <Rectangle Fill="Transparent"/> 
          <ContentPresenter x:Name="contentPresenter" Content="{TemplateBinding Content}" Margin="2" /> 
         </Grid> 
         <ControlTemplate.Triggers> 
          <Trigger Property="IsPressed" Value="True"> 
           <Setter Property="Foreground" Value="{StaticResource MainColorBrush2}"/> 
          </Trigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </UserControl.Resources> 
    <Grid> 
     <Button Command="{Binding Path=SmallPageSizeCommand}" Style="{StaticResource TransparentButtonStyle2}" Content="{StaticResource PageSmallIcon2}"/> 
     ... 
    </Grid> 
</UserControl> 

Ho deciso di mettere queste risorse in separato ResourceDictionaries. Ho in programma di avere più Paths e Brushes ... Inoltre mi piacerebbe avere solo uno stile per il pulsante. Fondamentalmente lo sto facendo, perché avevo uno stile per ciascuno dei miei pulsanti e Path per ogni specifico Button faceva parte di quello Button di ControlTemplate.

Così ho creato tre ResourceDictionariesColors.xaml, Icons.xaml e Controls.xaml e poi ho aggiornato App.xaml

<Application.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="Theme/Colors.xaml"/> 
      <ResourceDictionary Source="Theme/Icons.xaml"/> 
      <ResourceDictionary Source="Theme/Controls.xaml"/> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Application.Resources> 

Ora Path s' Fill proprietà non viene aggiornato quando si preme che Button. Qualcuno potrebbe spiegare perché non funziona in separato ResourceDictionaries e fornirmi una soluzione a questo problema?

UPDATE

Così ho scoperto che il problema è in Path. Quando ho quello Path in <UserControl.Resources>, i colori in Colors.xaml e lo stile di pulsante in Controls.xaml tutto funziona di nuovo.

Ho anche scoperto che quando ho il mio Path in Icons.xaml e lo uso nel mio UserControl come contenuto del pulsante

<Button Command="{Binding Path=SmallPageSizeCommand}" Style="{StaticResource TransparentButtonStyle2}" Content="{StaticResource PageSmallIcon2}"/> 

e non ho più istanze della mia UserControl ... poi Path è presente in una sola istanza di un UserControl alla volta.

+0

Tutto sembra a posto per me. Stai riscontrando errori in Output Window con il debugger allegato? Finché includi Colors.xaml prima di Controls.xaml, dovresti ottenere i risultati desiderati. –

+0

@NovitchiS No. Non c'è nessun errore nella finestra di output. –

+2

Il secondo problema dell'aggiornamento è dato dal fatto che si stanno dando gli stessi genitori di Element diversi in XAML. Per più 'Pulsanti' si imposta lo stesso' Percorso', definito come risorsa, come 'Contenuto' di Button'. Per risolvere questo problema, puoi contrassegnare la risorsa con l'attributo 'x: Shared =" False "'. In questo caso, il parser XAML genererà una nuova istanza dell'elemento Path per ciascun riferimento. –

risposta

13

La ragione di:

ho più istanze di mia UserControl ... poi il percorso è presente solo in un caso di un controllo utente alla volta

è perché si stanno dando il stesso Element genitori diversi in XAML. Stai impostando il contenuto di più controlli Button su un PathShape definito nelle risorse. Ai fini dell'ottimizzazione, ogni riferimento a una risorsa restituirà per impostazione predefinita la stessa istanza dell'oggetto e poiché in WPF ogni elemento può avere un solo genitore alla volta, solo l'ultimo Button nella dichiarazione XAML avrà il contenuto impostato sullo Path desiderato. . Per risolvere questo problema è possibile contrassegnare la risorsa con l'attributo x: Shared = "False". In questo caso, il parser XAML genererà una nuova istanza dell'elemento Path per ciascun riferimento.

+3

Sembra che questo valore predefinito sia retrocesso. Perché dovresti trovare qualcosa se non lo condividi effettivamente? –