我对必须肯定是最常见的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 :(无路径); DataItem = null;目标元素是
'CustomControl'(Name ='CCtl');目标属性为“ FocusedElement”
(输入“ IInputElement”)。


我不知道为什么会出现此错误。感谢收到任何指针,谢谢。

最佳答案

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

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


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

10-08 16:08