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
속성이 비어있을 때 이것은 Background
VisualBrush
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>
와우, 작동합니다! 고맙습니다. 그래서 ... 내 시도가 그렇지 않을 때 왜 작동합니까? 당신의 코드와 제 사이에 가장 큰 차이점은'Trigger'와'Visibility' 그리고 우리가'ControlTemplate'을 위해 사용하는 것입니다. – Joseph
편집을 보면'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