2009-08-11 7 views
0

J'ai une ressource de style externe dans un dictionnaire de ressources que je référence avec x: Key. Il a un x: TargetType spécifiant une cible (TextBlock). Est-il possible d'appliquer ceci à un contrôle contenant un TextBlock et que tous les éléments TextBlock de ce contrôle ont le style appliqué?WPF/XAML: définir un style avec un TargetType différent?

Merci, Robert

Répondre

4

La meilleure façon de le faire serait de définir un Style dans le contrôle basé sur votre ressource de style externe, mais ne spécifiez pas de clé x: juste le type cible.

<Style TargetType="{x:Type TextBlock}" BasedOn="{StaticResource SomeOtherStyle}"> 

Sans clé, il s'appliquera à tous les TextBlocks du contrôle.

0

Non, mais vous pouvez appliquer automatiquement un style à tous les éléments d'un certain type, comme celui-ci:

<!-- Applies to all buttons in scope of this style --> 
<Style x:Key="{x:Type Button}" TargetType="{x:Type Button}"> 
    ... 
</Style> 
0

Je pense que c'est ce que vous cherchez:

Votre contrôle utilisateur personnalisé "test":

<UserControl x:Class="WpfApplication4.test" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Height="300" Width="300"> 
    <Grid> 
     <TextBlock>test</TextBlock> 
    </Grid> 
</UserControl> 

Votre Styles document "Res/Styles.xaml"

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
<Style TargetType="{x:Type TextBlock}"> 
    <Style.Setters> 
     <Setter Property="Foreground" Value="Blue" /> 
    </Style.Setters> 
</Style> 

Votre fenêtre principale ou le parent:

<Window x:Class="WpfApplication4.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:uc="clr-namespace:WpfApplication4" 
Title="Window1" Height="300" Width="300"> 
<Window.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="Res/Styles.xaml"/> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Window.Resources> 

<Grid> 
    <uc:test></uc:test> 
</Grid> 

TextBlock dans le "test" de contrôle personnalisé affiche maintenant avec un premier plan bleu.

+0

Yup; sauf que cela ne fonctionne pas dans Silverlight. Mais c'est cool. Je l'ai résolu en enveloppant la propriété dans un autre. Merci! –

1

Pour développer un peu sur d'autres commentaires. Lorsque vous utilisez la syntaxe comme Brandon a montré:

<Style TargetType="{x:Type TextBlock}" BasedOn="{StaticResource SomeOtherStyle}"> 

Le BasedOn = « » est essentiellement une sorte de « héritage » de style. Ce style aura comme base de setters ceux du style sur lequel il est basé. Cela vous donne la possibilité d'augmenter le style avec les options qui s'appliquent uniquement dans ce cas ou, selon le cas, de redéfinir la portée du style.

Vous avez le style dans votre fichier de dictionnaire comme un style à clé, ne pouvant être appliqué explicitement. En "re-définissant" votre style comme Brandon vous l'a montré, vous pouvez maintenant redéfinir la portée en omettant la clé, la rendant ainsi applicable à tous les éléments du type cible dans la portée de ce style. Donc, si tous vos TextBlocks étaient dans une grille, vous pourriez avoir quelque chose comme ceci:

<Grid.Resources> 
<Style TargetType="{x:Type TextBlock}" BasedOn="{StaticResource MyBaseStyle}">     
</Style> 
</Grid.Resources> 
Questions connexes