0

C'est bizarre. J'ai créé un contrôle personnalisé appelé Switch. J'ai également défini un style pour TextBlock.Le style ContenPresenter TextBlock ne fonctionne pas dans Visual Studio ToolWindow Extensibilité

<!-- Switch --> 
<Style TargetType="{x:Type controls:Switch}"> 
    <Setter Property="Margin" 
      Value="3,3,3,3" /> 
    <Setter Property="MinWidth" 
      Value="40" /> 
    <Setter Property="MinHeight" 
      Value="24" /> 
    <Setter Property="On" 
      Value="ON" /> 
    <Setter Property="Off" 
      Value="OFF" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type controls:Switch}"> 
       <Grid> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="Auto" /> 
         <ColumnDefinition Width="*" /> 
         <ColumnDefinition Width="Auto" /> 
        </Grid.ColumnDefinitions> 
        <ContentPresenter Grid.Column="0" 
             Content="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=Off}" /> 
        <Border Grid.Column="1" 
          Background="{TemplateBinding Property=Background}" 
          BorderBrush="{TemplateBinding Property=BorderBrush}" 
          BorderThickness="{TemplateBinding Property=BorderThickness}" 
          CornerRadius="12,12,12,12" 
          HorizontalAlignment="Stretch" 
          VerticalAlignment="Center"> 
         <Track x:Name="PART_Track" 
           Minimum="0" 
           Maximum="1" 
           Orientation="Horizontal" 
           Value="0"> 
          <Track.Thumb> 
           <Thumb x:Name="PART_Thumb" 
             Style="{DynamicResource ResourceKey=SwitchThumb}" /> 
          </Track.Thumb> 
         </Track> 
        </Border> 
        <ContentPresenter Grid.Column="2" 
             Content="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=On}" /> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

<!-- Text Block --> 
<Style TargetType="{x:Type TextBlock}"> 
    <Setter Property="Margin" 
      Value="3,3,3,3" /> 
    <Setter Property="HorizontalAlignment" 
      Value="Left" /> 
    <Setter Property="VerticalAlignment" 
      Value="Center" /> 
    <Setter Property="TextAlignment" 
      Value="Left" /> 
    <Setter Property="TextWrapping" 
      Value="Wrap" /> 
</Style> 

Quand j'ajoute une instance de Switch (avec le style TextBlock) à une fenêtre simple, le ContentPresenter utilisé dans le commutateur est héritant style TextBlock.

enter image description here

Mais lorsque l'interrupteur est utilisé dans Visual Studio ToolWindow Extensibilité, le ContentPresenter utilisé dans le commutateur ne hérite pas le style TextBlock.

Remarquez l'alignement vertical et la marge, ils ne sont pas centrés et 3,3,3,3 comme définis dans le style.

Une idée pourquoi?

J'ai essayé d'utiliser snoop pour trouver les valeurs de TextBlock dans ContentPresenter et elles ne sont pas conformes au style que j'ai défini. REMARQUE: je ne peux pas définir les propriétés TextElement Attached sur tous les ContentPresenters car j'ai beaucoup de contrôles personnalisés et je préférerais plutôt définir un style pour TextBlock à la place.

Répondre

1

La réponse à "pourquoi" est probablement la suivante: implicite TextBox Le style n'est pas utilisé dans la fenêtre d'outils.

Je ne m'en soucierais pas vraiment cependant. Si je devais styliser ce switch je dirais, OK, je veux un peu de séparation entre les Track et les étiquettes et je les veux toutes verticalement centrées. Et c'est exactement ce qui se passerait dans le style Switch. Je ne compterais pas sur la zone de texte pour accomplir cela. Donc, ce serait comme ceci:

 <ControlTemplate TargetType="{x:Type controls:Switch}"> 
      <Grid> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="Auto" /> 
        <ColumnDefinition Width="*" /> 
        <ColumnDefinition Width="Auto" /> 
       </Grid.ColumnDefinitions> 
       <ContentPresenter Grid.Column="0" 
            Content="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=Off}" VerticalAlignment="Center"/> 
       <Border Grid.Column="1" 
         Background="{TemplateBinding Property=Background}" 
         BorderBrush="{TemplateBinding Property=BorderBrush}" 
         BorderThickness="{TemplateBinding Property=BorderThickness}" 
         CornerRadius="12,12,12,12" 
         HorizontalAlignment="Stretch" 
         VerticalAlignment="Center" Margin="3,0"> 
        <Track x:Name="PART_Track" 
          Minimum="0" 
          Maximum="1" 
          Orientation="Horizontal" 
          Value="0"> 
         <Track.Thumb> 
          <Thumb x:Name="PART_Thumb" 
            Style="{DynamicResource ResourceKey=SwitchThumb}" /> 
         </Track.Thumb> 
        </Track> 
       </Border> 
       <ContentPresenter Grid.Column="2" 
            Content="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=On}" VerticalAlignment="Center"/> 
      </Grid> 
     </ControlTemplate> 
+0

1. Merci pour votre réponse. Que voulez-vous dire par "le style de TextBox implicite n'est pas utilisé dans la fenêtre d'outils"? 2. Comme je l'ai mentionné dans mon article, j'utilise aussi ce style de bloc de texte dans d'autres contrôles. Je ne veux pas mettre l'Alignement et la Marge partout. – sudarsanyes

+0

pour répondre # 1: qu'est-ce que vous voulez dire par "Visual Studio ToolWindow Extensibility", je ne comprends pas vraiment où cela serait ... à # 2 J'ai lu dans votre question que vous ne voulez pas faire cela . Mais soyons honnêtes, combien de styles avez-vous vraiment que ce serait lourd. En outre, le définir dans vos styles est la voie à suivre. Jetez un coup d'oeil au style par défaut de [CheckBox] (https://msdn.microsoft.com/en-us/library/ms752319 (v = vs.110) .aspx), voir le 'Margin' et' VerticalAlignment' dans le 'ContentPresenter'? –

+0

En outre, je ne suis pas sûr si vous avez configuré vos DependencyProperties 'On' et' Off' pour être de type 'object' ou' string'. Si c'était 'object' qui autoriserait une icône par exemple, alors vous auriez à spécifier la marge dans l'icône, sinon les icônes resteraient en haut et n'auraient pas de marge par défaut sur la piste. Donc, la marge et l'alignement vertical appartiennent plutôt au commutateur qu'au contenu du commutateur. –