i具有以下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>
我已经在窗口中添加了一个文本框,现在想在窗口加载时将焦点设置为它。到目前为止,什么都没有效用,我相信这是因为我需要将重点放在控制模板中的文本上。这就是触发器应该做的。
不幸的是,我无法弄清楚应该指定的触发器。以上代码只会给出运行时投诉:
system.windows.data错误:4:找不到使用参考'elementName = textedit'的源。绑定表达:(无路径);dataitem = null;目标元素是'textedit'(name ='markerTextedIt');目标属性是"焦点"(类型为" iinputelement")
我也不相信触发器会将属性设置在正确的聚焦管理器上,因为我认为我需要将其设置在窗口的FocusManager上。
所以我认为我需要等同的东西:
(伪代码)findancestor(window).focusmanager.focusedelement = controlTemplate.controls('textedit')
如果这有意义。
欢迎任何建议,因为我要做的就是让文本框在窗口加载时获得焦点。在Winforms中,这很容易,但在WPF中似乎是火箭科学。
更新:我认为我已经确认了我的理论为以下代码作品:
private void MarkerEditorWindow_Loaded(object sender, RoutedEventArgs e)
{
var control = (UIElement)MarkerTextEdit.Template.FindName("textEdit", MarkerTextEdit);
control.Focus();
}
解决方案是将触发器更改为:
<Trigger Property="IsFocused" Value="true">
<Setter TargetName="textEdit" Property="FocusManager.FocusedElement" Value="{Binding ElementName=textEdit}"/>
</Trigger>
有趣的是,即使我不将任何内容放在XAML或代码范围内引起它,这也会导致textedIt的重点。看起来WPF一直在尝试做到这一点,但被我的模板挫败了。