0

이상합니다. Switch라는 사용자 지정 컨트롤을 만들었습니다. 또한 TextBlock 스타일을 정의했습니다. ContenPresenter Visual Studio에서 TextBlock 스타일이 작동하지 않습니다. 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

그러나 스위치는 비주얼 스튜디오 ToolWindow 확장 내에서 사용하는 경우, 스위치 내에서 사용 된 ContentPresenter는 TextBlock의 스타일을 상속하지 않습니다.

수직 정렬 및 여백에 유의하십시오.이 문자는 가운데 맞춤이 아니며 스타일에 설정된대로 3,3,3,3입니다.

왜 그런가?

스눕을 사용하여 ContentPresenter 내의 TextBlock 값을 알아 냈습니다. 정의한 스타일에 맞지 않습니다.

참고 : 많은 사용자 지정 컨트롤이 있으므로 TextBlock에 대한 스타일 설정 대신 TextElement 연결 속성을 모든 ContentPresenter에 설정할 수 없습니다.

답변

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. 답변 해 주셔서 감사합니다. "암시 적 TextBox 스타일이 도구 창에서 사용되고 있지 않다"는 것은 무엇을 의미합니까? 2. 내 게시물에서 언급 한 것처럼 다른 컨트롤에서도 해당 텍스트 블록 스타일을 사용하고 있습니다. 어디에서나 정렬과 여백을 설정하고 싶지 않습니다. – sudarsanyes

+0

# 1 : 정확히 "Visual Studio ToolWindow Extensibility"로 무엇을 의미합니까? 나는 이것이 실제로 어디로 갈지 모르는 것 같습니다. # 2 당신의 질문에 당신이 그것을하고 싶지 않다는 것을 읽었습니다. . 그러나 솔직히 말해서, 얼마나 많은 스타일이 정말로 귀찮습니다. 또한, 당신의 스타일로 그것을 정의하는 것은 갈 길입니다. [CheckBox의 기본 스타일] (https://msdn.microsoft.com/en-us/library/ms752319(v=vs.110) .aspx)을 살펴보고, '여백'과 'VerticalAlignment'를 참조하십시오. 'ContentPresenter'? –

+0

또한 DependencyProperties를 On 및 Off로 설정하는 것이'object' 또는'string' 유형으로되어 있는지 확신 할 수 없습니다. 예를 들어 아이콘을 허용하는'object'이고 아이콘에 여백을 지정해야한다면, 아이콘이 맨 위에 붙어서 트랙에 대한 기본 마진을 가지지 않을 것입니다. 그래서 정말로 마진과 수직 정렬은 스위치의 내용보다는 스위치에 속합니다. –