【问题标题】:Setting Focus on a Control Within a ControlTemplate (Part 2)在 ControlTemplate 中的控件上设置焦点(第 2 部分)
【发布时间】:2011-05-18 10:35:26
【问题描述】:

我不知道肯定是最常见的 WPF 要求之一。我已阅读 this question,但我的解决方案实施不起作用。

这是无外观控件的标记:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                xmlns:local="clr-namespace:WpfTest">
  <Style TargetType="{x:Type local:CustomControl}">
    <Setter Property="Template">
      <Setter.Value>
        <ControlTemplate TargetType="{x:Type local:CustomControl}">
          <Border>
            <TextBox x:Name="myTextBox" />
          </Border>
          <ControlTemplate.Triggers>
            <Trigger Property="IsFocused"
                     Value="True">
              <Setter Property="FocusManager.FocusedElement"
                      Value="{Binding ElementName=myTextBox}" />
              <Setter TargetName="myTextBox"
                      Property="Background"
                      Value="Green" />
            </Trigger>
          </ControlTemplate.Triggers>
        </ControlTemplate>
      </Setter.Value>
    </Setter>
  </Style>
</ResourceDictionary>

这是包含 CustomControl 实例的 Window 的标记:

<Window x:Class="WpfTest.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfTest"
        Title="Window1" Height="300" Width="300">

  <local:CustomControl x:Name="CCtl" />
</Window>

下面是代码隐藏:

public partial class Window1 : Window
{
    public Window1()
    {
        InitializeComponent();
        Loaded += (RoutedEventHandler)delegate { CCtl.Focus(); };
    }
}

加载 Window1 时,文本框变为绿色(表示触发器有效),但焦点仍位于 CCtl 而不是文本框。毫无疑问,这与显示以下数据错误的输出有关:

找不到与引用“ElementName=myTextBox”进行绑定的源。 BindingExpression:(无路径);数据项=空;目标元素是 'CustomControl'(名称='CCtl');目标属性是“FocusedElement” (输入“IInputElement”)。

我不知道为什么会出现这个错误。任何指点感激地收到,谢谢。

【问题讨论】:

    标签: wpf xaml focus controltemplate focusmanager


    【解决方案1】:

    尝试将其用于您的触发器:

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

    错误告诉您它无法找到 myTextBox,因为名称不在应用 FocusedElement 属性的范围内。在这种情况下,它在 CCtl 实例本身上,它无法在自己的模板中看到。通过在模板内设置属性,Binding 可以定位命名元素。

    【讨论】:

      【解决方案2】:

      我可能错了,但我认为您的问题在于您的属性触发器。

      通过将您的 TextBox 设置为焦点,您实际上使模板父级上的 Trigger 无效,因此触发器展开并反转将焦点设置在 TextBox 上(因此取消焦点)。

      【讨论】:

        猜你喜欢
        • 2010-09-14
        • 2011-03-21
        • 2011-10-26
        • 1970-01-01
        • 1970-01-01
        • 2014-04-05
        • 2016-10-22
        • 2017-02-24
        • 2014-06-30
        相关资源
        最近更新 更多