首页 文章

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

提问于
浏览
0

我有以下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:无法找到引用'ElementName = textEdit'的绑定源 . BindingExpression :(没有路径);的DataItem = NULL; target元素是'TextEdit'(Name ='MarkerTextEdit'); target属性是'FocusedElement'(类型'IInputElement')

我也不相信触发器会在正确的FocusManager上设置属性,因为我认为我需要在Window的FocusManager上设置它 .

所以我想我需要一些相当于:

(伪代码)FindAncestor(Window).FocusManager.FocusedElement = ControlTemplate.Controls('textEdit')

如果那有意义的话 .

任何建议都是受欢迎的,因为我想要做的就是让我的TextBox在窗口加载时获得焦点 . 在WinForms中有些愚蠢的东西,但似乎是WPF中的火箭科学 .

更新:我认为我已将我的理论证实为以下代码隐藏工作:

private void MarkerEditorWindow_Loaded(object sender, RoutedEventArgs e)
    {
        var control = (UIElement)MarkerTextEdit.Template.FindName("textEdit", MarkerTextEdit);

        control.Focus();
    }

1 回答

  • 1

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

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

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

相关问题