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 ResourceDictionaries
Colors.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.
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. –
@NovitchiS No. Non c'è nessun errore nella finestra di output. –
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. –