我有以下ControlTemplate:
<ControlTemplate TargetType="dxe:TextEdit" x:Key="TextEditMultiStyle">
<Border x:Name="border" BorderBrush="#054c74" BorderThickness="1" CornerRadius="1">
<Border.Effect>
<DropShadowEffect ShadowDepth="0" Color="#0980c2" Opacity="1" BlurRadius="5" />
</Border.Effect>
<dxe:TextEdit x:Name="textEdit" TextWrapping="Wrap" AcceptsReturn="True" Text="{TemplateBinding Text}" BorderThickness="0"
EditValue="{Binding RelativeSource={RelativeSource TemplatedParent},
Path=EditValue, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}"
VerticalContentAlignment="Top"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsFocused" Value="true">
<Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=textEdit}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
我已经在我的窗口中添加了一个TextBox,现在想要在窗口加载时将焦点设置到它 . 到目前为止没有任何工作,我相信这是因为我需要将焦点设置到ControlTemplate中的TextEdit . 这就是Trigger应该做的事情 .
不幸的是,我无法确定我应该指定的触发器 . 上面的代码只是给出了运行时投诉:
System.Windows.Data错误:4:无法找到引用'ElementName = textEdit'的绑定源 . BindingExpression :(没有路径);的DataItem = NULL; target元素是'TextEdit'(Name ='MarkerTextEdit'); target属性是'FocusedElement'(类型'IInputElement')
我也不相信触发器会在正确的FocusManager上设置属性,因为我认为我需要在Window的FocusManager上设置它 .
所以我想我需要一些相当于:
(伪代码)FindAncestor(Window).FocusManager.FocusedElement = ControlTemplate.Controls('textEdit')
如果那有意义的话 .
任何建议都是受欢迎的,因为我想要做的就是让我的TextBox在窗口加载时获得焦点 . 在WinForms中有些愚蠢的东西,但似乎是WPF中的火箭科学 .
更新:我认为我已将我的理论证实为以下代码隐藏工作:
private void MarkerEditorWindow_Loaded(object sender, RoutedEventArgs e)
{
var control = (UIElement)MarkerTextEdit.Template.FindName("textEdit", MarkerTextEdit);
control.Focus();
}
1 回答
解决方案是将触发器更改为:
有趣的是,这也导致TextEdit被聚焦,即使我没有在XAML或代码隐藏中添加任何东西来引起它 . 看起来WPF一直试图这样做,但被我的模板挫败了 .