我有以下的ControlTemplate:WPF设置重点控制模板内控制
<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>
我添加了一个文本框到我的窗口,现在想将焦点设置到它的窗口加载时。到目前为止没有任何工作,我相信这是因为我需要将焦点设置到我的ControlTemplate中的TextEdit。这就是触发器应该做的事情。
不幸的是,我不能确定我应该指定什么作为触发器。以上代码只是给出了运行时间投诉:
System.Windows.Data错误:4:找不到与参考'ElementName = textEdit'绑定的源。 BindingExpression :(无路径);的DataItem = NULL;目标元素是'TextEdit'(Name ='MarkerTextEdit');目标属性是'FocusedElement'(类型'IInputElement')
我也不确定触发器是否会在正确的FocusManager上设置属性,因为我认为我需要将它设置在Window的FocusManager上。
所以我想我需要的东西相当于:
(伪代码) FindAncestor(窗口).FocusManager.FocusedElement = ControlTemplate.Controls( '文字编辑')
如果让任何意义。
欢迎任何建议,因为我想要做的就是让我的TextBox在窗口加载时获得焦点。一些在WinForms中非常容易,但在WPF中似乎是火箭科学。
更新:我想我已经证明了我的理论如下面的代码隐藏的工作原理:
private void MarkerEditorWindow_Loaded(object sender, RoutedEventArgs e)
{
var control = (UIElement)MarkerTextEdit.Template.FindName("textEdit", MarkerTextEdit);
control.Focus();
}