0

這很奇怪。 我創建了一個名爲Switch的自定義控件。我也爲TextBlock定義了一種風格。ContenPresenter TextBlock樣式在Visual Studio中不起作用ToolWindow擴展性

<!-- 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> 

當我(連同TextBlock的樣式),以一個簡單的窗口添加開關的一個實例,在交換機中使用的ContentPresenter爲繼承的TextBlock風格。

enter image description here

但是當交換機的Visual Studio工具窗口擴展中使用,在交換機中使用的ContentPresenter不會繼承TextBlock的風格。

注意垂直對齊和邊距,它們不是中心,3,3,3,3在樣式中設置。

任何想法爲什麼?

我試過使用snoop來找出ContentPresenter中的TextBlock的值,它們不是根據我定義的樣式。

注:我無法在所有ContentPresenter上設置TextElement附加屬性,因爲我有很多自定義控件,因此寧願爲TextBlock設置樣式。

回答

1

「爲什麼」的答案可能是:隱含的TextBox樣式未在工具窗口中使用。

雖然我不太在意。如果我要設計這個開關,我會說,好的,我希望Track和標籤之間有一點分離,我希望它們都垂直居中。這正是Switch風格所要做的。我不會依賴文本框來實現這一點。所以它會是這樣的:

 <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.感謝您的回答。 「隱式文本框樣式沒有在工具窗口中使用」是什麼意思? 2.就像我在我的文章中提到的,我也在其他控件中使用該文本塊樣式。我不想在任何地方設置對齊和保證金。 – sudarsanyes

+0

回答#1:你說的「Visual Studio ToolWindow Extensibility」究竟意味着什麼,我似乎並沒有真正明白這將是什麼......對於#2我確實在你的問題中讀到你不想這麼做。但說實話,你真的有多少款式,這會很麻煩。此外,在你的風格中定義它是一種方式。只需查看[CheckBox的默認樣式](https://msdn.microsoft.com/en-us/library/ms752319(v = vs.110).aspx),請參閱「CheckBox的默認樣式」中的「Margin」和「VerticalAlignment」 'ContentPresenter'? –

+0

此外,我不確定您是否將您的DependencyProperties On和Off設置爲'object'或'string'類型。如果是「對象」,例如允許一個圖標,然後您將不得不在圖標中指定邊距,否則圖標將粘貼到頂部,並且不會有默認的邊距。所以真正的邊緣和垂直對齊屬於交換機而不是交換機的內容 –