2013-06-11 3 views
0

WPF의 TextBox에 "힌트 텍스트"기능을 구현하려고합니다. 기본 텍스트를 잘 설정할 수는 있지만 컨트롤이 일반 TextBox로 모양을 되돌리려면 문제가 발생합니다.트리거 된 컨트롤 템플릿을 지우는 방법

트리거

<Trigger Property="Text" Value="{x:Static sys:String.Empty}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="TextBox"> 
       <TextBox> 
        <TextBox.Background> 
         <VisualBrush AlignmentX="Left" AlignmentY="Center" Stretch="UniformToFill"> 
          <VisualBrush.Visual> 
           <Label Content="{TemplateBinding TextBox.Tag}" Background="White"/> 
          </VisualBrush.Visual> 
         </VisualBrush> 
        </TextBox.Background> 
       </TextBox> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Trigger> 

Text 속성이 비어있을 때 이것은 BackgroundVisualBrush A를 설정합니다 : 여기에 지금까지 가지고있는 트리거입니다. 사용자가 TextBox을 선택하여 텍스트를 입력하면이 ControlTemplate을 삭제해야합니다. 여기

내가 뭘하려 :

트리거 B

<Trigger Property="IsKeyboardFocused" Value="True"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="TextBox"> 
       <TextBox/> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Trigger> 

이 두 가지가 함께 작동하지 않습니다. 각각 Background 색을 변경하여 각각을 테스트했습니다. 내가 어느 하나를 언급하면, 그들은 각각 일할 것이다. 둘 다 주석을 제거하면 트리거 A가 작동하고 B는 표시되지 않습니다. 트리거 A를 제거하거나 덮어 쓸 수 있습니까?

트리거 조건이 더 이상 충족되지 않을 때 이러한 템플릿의 기능이 해제되지만 예를 들어 TextBox에 텍스트를 입력 할 때 트리거 A의 설정이 사라지지 않는다는 것을 알고 있습니다. Text 속성과 마찬가지로 여전히 String.Empty 또는 뭔가 있습니다.

그래서 나는 무엇을 놓치고 있습니까? 나는 전체 템플릿을 볼 수 없습니다

<UserControl.Resources> 
    <Style TargetType="TextBox" x:Key="FormsTextBox"> 
     <Setter Property="Width" Value="45"/> 
     <Setter Property="Margin" Value="3 2 3 2"/> 

     <Style.Triggers> 
      <Trigger Property="Text" Value="{x:Static sys:String.Empty}"> 
       <Setter Property="Template"> 
        <Setter.Value> 
         <ControlTemplate TargetType="TextBox"> 
          <TextBox> 
           <TextBox.Background> 
            <VisualBrush AlignmentX="Left" AlignmentY="Center" Stretch="UniformToFill"> 
             <VisualBrush.Visual> 
              <Label Content="{TemplateBinding TextBox.Tag}" Background="White" Width="45"/> 
             </VisualBrush.Visual> 
            </VisualBrush> 
           </TextBox.Background> 
          </TextBox> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 

답변

2

하지만이 조금 overcomplicated 같습니다

편집 : 여기

(이것은 훨씬 더가 아니다) 전체 스타일입니다. 워터 마크 텍스트를 얻으려고한다고 가정합니다. 힌트 사용 상자 표준 인 ToolTip 속성의 경우 TextBox을 가리키면 팝업에 텍스트가 기본적으로 표시되지만이 동작은 비활성화 될 수 있으며 ToolTip 속성이 다시 사용됩니다. 그것이 일회성 일이 있다면 다음 Style 또는 Template 어떤없이 같은 것을 할 수있는 일,

<Window ...> 
    <Window.Resources> 
     <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/> 
     <Style TargetType="{x:Type TextBox}" x:Key="WatermarkTextBoxStyle"> 
     <Setter Property="ToolTipService.IsEnabled" Value="False"/> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type TextBox}"> 
        <Border Background="{DynamicResource {x:Static SystemColors.WindowBrushKey}}" 
         BorderThickness="1" 
         BorderBrush="{DynamicResource {x:Static SystemColors.WindowFrameBrushKey}}"> 
        <Grid> 
         <TextBlock Margin="5,0,0,0" 
          Text="{TemplateBinding ToolTip}" 
          Visibility="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Text.IsEmpty, Converter={StaticResource BooleanToVisibilityConverter}}" 
          Opacity="0.5"/> 
         <ScrollViewer Name="PART_ContentHost"/> 
        </Grid> 
        </Border> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
     </Style> 
    </Window.Resources> 

    <TextBox ToolTip="watermark text" Style="{StaticResource WatermarkTextBoxStyle}"/> 
</Window> 

또는 :

를 다음과 같이 TextBox 위해 뭔가를 - 내가 좋아하는 - 당신은 재사용 Style 만들 수 있습니다
<Grid Background="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"> 
    <TextBlock Margin="5,0,0,0" 
     Text="watermark text" 
     Opacity="0.5" 
     Visibility="{Binding ElementName=myTextBox, Path=Text.IsEmpty, Converter={StaticResource BooleanToVisibilityConverter}}" /> 
    <TextBox Name="myTextBox" Background="Transparent" /> 
</Grid> 
+0

와우, 작동합니다! 고맙습니다. 그래서 ... 내 시도가 그렇지 않을 때 왜 작동합니까? 당신의 코드와 제 사이에 가장 큰 차이점은'Trigger'와'Visibility' 그리고 우리가'ControlTemplate'을 위해 사용하는 것입니다. – Joseph

+1

편집을 보면'TextBox'를'TextBox'의'Template'으로 설정하고 있습니다. 다른 TextBox처럼 작동하지 않을 것입니다. 'TextBox'에 대한 템플릿은 ['PART_ContentHost'] (http://msdn.microsoft.com/en-us/library/ms752068(v=vs.110).aspx)에 템플릿의 정확한 이름이 필요합니다. 그래서 컨트롤은 그것에 바인딩 할 수 있고 텍스트를 입력 할 수 있습니다. 그래서 대신'ControlTemplate'의'TextBox'는'x : Name = "PART_ContentHost"로'ScrollViewer'에 넣습니다. 예제에서와 같이, 그 배경을 바꿉니다. – dkozl