WPF设置焦点以控制控件模板内

时间:2017-09-14 11:06:02

标签: wpf focus controltemplate

我有以下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();
    }

1 个答案:

答案 0 :(得分:1)

解决方案是将触发器更改为:

<Trigger Property="IsFocused" Value="true">
            <Setter TargetName="textEdit" Property="FocusManager.FocusedElement" Value="{Binding ElementName=textEdit}"/>
        </Trigger>

有趣的是,这也会导致TextEdit集中注意力,即使我没有在XAML或代码隐藏中添加任何东西来引起它。看起来WPF一直试图这样做,但被我的模板挫败了。