2010-12-13 47 views
1

J'ai un dictionnaire de ressources que j'utilise pour définir le look-and-feel (style) de mon application.Définition d'un style Elements.Resource à l'aide de BasedOn dans un dictionnaire de ressources

Je viens de créer un autre dictionnaire de ressources contenant des DataTemplates que j'utilise sur plusieurs écrans différents (et même plusieurs fois dans le même écran) pour afficher mes objets métier.

Je voudrais changer certains des styles par défaut dans mes DataTemplates afin que les contrôles s'ajustent mieux; Cependant, j'aimerais que les commandes héritent du même style que le reste de l'écran. Donc, naturellement, je veux utiliser la propriété BasedOn pour cette tâche. Le problème que j'ai est que je ne suis pas sûr de quoi définir la propriété BasedOn à.

Par exemple, dans le dictionnaire de ressources qui contient mes styles (appelé "myStyle.xaml") J'ai:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:primatives="clr-namespace:System.Windows.Controls.Primitives;assembly=PresentationFramework" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
<Style TargetType="{x:Type Label}"> 
     <Setter Property="Foreground" Value="#F5F5F5" /> 
     <Setter Property="FontSize" Value="12"></Setter> 
     <Setter Property="Width" Value="120"></Setter> 
     <Setter Property="FontFamily" Value="Arial"></Setter> 
    </Style> 
    <Style TargetType="{x:Type TextBox}"> 
     <Setter Property="FontSize" Value="12"></Setter> 
     <Setter Property="Width" Value="120"></Setter> 
     <Setter Property="Height" Value="25"></Setter> 
     <Setter Property="Background" Value="Black"></Setter> 
    </Style> 
    <!-- .... and so on .... --> 
</ResourceDictionary> 

J'utilise cette ressource dans la fenêtre suivante:

<Window x:Class="SiteSetupWindow4" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:primatives="clr-namespace:System.Windows.Controls.Primitives;assembly=PresentationFramework" 
     Title="A Screen"> 

    <Window.Resources> 
     <ResourceDictionary x:Key="defaultStyleX"> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary x:Name="DefaultStyles" Source="Resources/myStyle.xaml" /> 
       <ResourceDictionary x:Name="Templates" Source="Resources/myTemplates.xaml"></ResourceDictionary> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 

    </Window.Resources> 

Maintenant, j'ai un autre dictionnaire de ressources qui contient DataTemplates que j'utilise dans ma fenêtre. Il s'appelle "myTemplates". Le style est appliqué au DataTemplate comme prévu; cependant, je voudrais remplacer certains aspects du style dans le DataTemplate (Like width par exemple).

C'est ce que j'ai fatigué, mais je ne peux pas obtenir la propriété BasedOn travailler ...

(myTemplate.xaml)

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 

    <DataTemplate x:Key="PanelInfo"> 
      <StackPanel> 
       <StackPanel.Resources> 
        <Style TargetType="TextBox" BasedOn="{StaticResource {x:Type TextBox}}"> 
         <Setter Property="Width" Value="120" /> 
        </Style> 
        <Style TargetType="Label"> 
         <Setter Property="Width" Value="180" /> 
        </Style> 
        <Style TargetType="ComboBox"> 
         <Setter Property="Width" Value="120" /> 
        </Style> 
       <StackPanel.Resources> 
       <StackPanel Orientation="Horizontal"> 
        <Label Content="Type:"></Label> 
        <ComboBox> 
         <ComboBoxItem Content="{Binding Path=Type}" IsSelected="True"></ComboBoxItem> 
        </ComboBox> 
        <!--...and so on --> 
       </StackPanel> 
      </StackPanel> 
</ResourceDictionary> 

Cela échoue .... J'ai aussi essayé d'utiliser DynamicResource, mais cela échoue également. Je ne sais pas comment contourner cela.

Un conseil serait grandement apprécié!

Merci,

-Frinny

+0

Avez-vous trouvé la solution? –

Répondre

0

La façon dont vous avez BasedOn pour un type est correct. Cela fonctionnera en théorie tant que, au moment de l'exécution, le style sur lequel vous vous basez est fusionné correctement dans l'arborescence. Assurez-vous que le "myStyles.xaml" a été correctement fusionné. Vous pouvez vérifier cela en supprimant votre style que vous avez essayé de modifier et assurez-vous qu'il s'affiche correctement à partir de votre style dans "myStyles.xaml". Si ce n'est pas le cas, il y a beaucoup d'endroits où vous pouvez vous tromper, mais il est toujours utile d'essayer de fusionner les styles dans le fichier sur lequel vous travaillez, puis de travailler dans l'arborescence pour voir où elle est absente.

Cet utilitaire vous aidera à voir ce qui se passe dans l'arborescence au moment de l'exécution.

http://blois.us/Snoop/

1

j'avais le même problème avec un style de bouton étendu. Le ResourceKey= est ce qui a résolu pour moi.

Cela a fonctionné:

<Style x:Name="ButtonVisibility" 
     TargetType="{x:Type Button}" 
     BasedOn="{StaticResource ResourceKey={x:Type Button}}"> 
+0