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



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一直在尝试做到这一点,但被我的模板挫败了。

最新更新