Wpf 如何将焦点设置为内部文本框,但不显示闪烁的插入符号?
我为WPF文本框制作了这个控件模板Wpf 如何将焦点设置为内部文本框,但不显示闪烁的插入符号?,wpf,xaml,Wpf,Xaml,我为WPF文本框制作了这个控件模板 <Style x:Key="SearchTextBox" TargetType="TextBox"> <Setter Property="BorderThickness" Value="0" /> <Setter Property="Template"> <Setter.Value>
<Style x:Key="SearchTextBox" TargetType="TextBox">
<Setter Property="BorderThickness" Value="0" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="TextBox">
<Border
BorderBrush="{StaticResource Grey200Brush}"
BorderThickness="1">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<glph:GlyphAwesome
Grid.Column="0"
Glyph="search"
Margin="4"
FontFamily="{StaticResource MyFontFamily}"
Foreground="{StaticResource Grey200Brush}"
VerticalAlignment="Center"
HorizontalAlignment="Left"
Visibility="{Binding ElementName=TextField, Path=Text, Mode=TwoWay, Converter={StaticResource InverseEmptyStringToVisibilityConverter}}"
FontSize="13"/>
<TextBox
Grid.Column="1"
BorderThickness="0"
Margin="4"
VerticalAlignment="Center"
FontFamily="{StaticResource MyFontFamily}"
Foreground="{StaticResource Blue900Brush}"
x:Name="TextField"
Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Text, UpdateSourceTrigger=PropertyChanged}"/>
</Grid>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<TextBox
Name="myTextBox"
Text="{Binding FieldId, TargetNullValue='', UpdateSourceTrigger=PropertyChanged}"
Style="{StaticResource SearchTextBox}"
MinWidth="150"
VerticalAlignment="Center"
Focusable="True"/>
只有用鼠标单击文本框(内部)时,插入符号才会出现
我在这里该怎么办?
以某种方式将焦点从outed转移到内部文本框,或者?
另外,如何在文本框聚焦而不是开始键入时折叠图示符?您的模板错误。将
文本框
放在文本框
中会让您感到奇怪TextBox
使用ScrollViewer
作为主机呈现其内容。这允许文本滚动。通常,内容主机可以是任何框架元素
。它必须命名为PART\u ContentHost
始终检查以获取WPF控件的默认样式和模板、命名零件和视觉状态。在这里,您还可以找到,并在顶部找到必须是模板一部分的强制命名元素列表
通过将内部的文本框
替换为名为PART\u ContentHost的ScrollViewer
来修复模板:
<Style x:Key="SearchTextBox" TargetType="TextBox">
<Setter Property="BorderThickness" Value="0" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="TextBox">
<Border
BorderBrush="{StaticResource Grey200Brush}"
BorderThickness="1">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<glph:GlyphAwesome x:Name="SearchSymbol"
Grid.Column="0"
Glyph="search"
Margin="4"
FontFamily="{StaticResource MyFontFamily}"
Foreground="{StaticResource Grey200Brush}"
VerticalAlignment="Center"
HorizontalAlignment="Left"
FontSize="13"/>
<ScrollViewer x:Name="PART_ContentHost"
Grid.Column="1"
Margin="0" />
</Grid>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsKeyboardFocusWithin" Value="True">
<Setter TargetName="SearchSymbol"
Property="Visibilty"
Value="Collapsed" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
您的模板错误。将文本框
放在文本框
中会让您感到奇怪
TextBox
使用ScrollViewer
作为主机呈现其内容。这允许文本滚动。通常,内容主机可以是任何框架元素
。它必须命名为PART\u ContentHost
始终检查以获取WPF控件的默认样式和模板、命名零件和视觉状态。在这里,您还可以找到,并在顶部找到必须是模板一部分的强制命名元素列表
通过将内部的文本框
替换为名为PART\u ContentHost的ScrollViewer
来修复模板:
<Style x:Key="SearchTextBox" TargetType="TextBox">
<Setter Property="BorderThickness" Value="0" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="TextBox">
<Border
BorderBrush="{StaticResource Grey200Brush}"
BorderThickness="1">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<glph:GlyphAwesome x:Name="SearchSymbol"
Grid.Column="0"
Glyph="search"
Margin="4"
FontFamily="{StaticResource MyFontFamily}"
Foreground="{StaticResource Grey200Brush}"
VerticalAlignment="Center"
HorizontalAlignment="Left"
FontSize="13"/>
<ScrollViewer x:Name="PART_ContentHost"
Grid.Column="1"
Margin="0" />
</Grid>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsKeyboardFocusWithin" Value="True">
<Setter TargetName="SearchSymbol"
Property="Visibilty"
Value="Collapsed" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
您采取了错误的方法。在TextBox控件模板中嵌入TextBox是不正确的。您应该改为使用Blend for Visual Studio提取文本框控件模板,然后对其进行修改以添加图标。然后,您可以使用控件模板触发器正确显示/隐藏图标。如果要在文本框具有键盘焦点时显示/隐藏图标,请使用IsKeyboardFocusWithin属性。您采取了错误的方法。在TextBox控件模板中嵌入TextBox是不正确的。您应该改为使用Blend for Visual Studio提取文本框控件模板,然后对其进行修改以添加图标。然后,您可以使用控件模板触发器正确显示/隐藏图标。如果要在文本框具有键盘焦点时显示/隐藏图标,请使用IsKeyboardFocusInside属性。