我有以下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:无法找到带引用的绑定源&#39; ElementName = textEdit&#39;。 BindingExpression :(没有路径);的DataItem = NULL;目标元素是&#39; TextEdit&#39; (名称=&#39; MarkerTextEdit&#39);目标财产是'FocusedElement&#39; (键入&#39; IInputElement&#39;)
我还不相信触发器会在正确的FocusManager上设置属性,因为我认为我需要在Window的FocusManager上设置它。
所以我认为我需要的东西相当于:
(伪代码) FindAncestor(窗口).FocusManager.FocusedElement = ControlTemplate.Controls(&#39;文本编辑&#39)
如果这是有道理的。
欢迎任何建议,因为我想要做的就是让我的TextBox在窗口加载时获得焦点。在WinForms中有些愚蠢但在WPF中似乎是火箭科学。
更新:我认为我已经证实我的理论是以下代码隐藏的工作:
private void MarkerEditorWindow_Loaded(object sender, RoutedEventArgs e)
{
var control = (UIElement)MarkerTextEdit.Template.FindName("textEdit", MarkerTextEdit);
control.Focus();
}
答案 0 :(得分:1)
解决方案是将触发器更改为:
<Trigger Property="IsFocused" Value="true">
<Setter TargetName="textEdit" Property="FocusManager.FocusedElement" Value="{Binding ElementName=textEdit}"/>
</Trigger>
有趣的是,这也会导致TextEdit集中注意力,即使我没有在XAML或代码隐藏中添加任何东西来引起它。看起来WPF一直试图这样做,但被我的模板挫败了。