Настройка фокусировки на элемент управления в контрольной таблице (часть 2)
Я озадачен тем, что, безусловно, должно быть одним из самых распространенных требований WPF. Я прочитал этот вопрос, но моя реализация решения не работает.
Здесь разметка для беззаботного управления:
<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 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" ).
Я не знаю, почему эта ошибка появляется. Любые указатели с благодарностью получили, спасибо.
Ответы
Ответ 1
Попробуйте использовать это для своего триггера:
<Trigger Property="IsFocused" Value="True">
<Setter TargetName="myTextBox" Property="FocusManager.FocusedElement" Value="{Binding ElementName=myTextBox}" />
</Trigger>
Ошибка сообщает вам, что он не может найти myTextBox, потому что имя не находится в области, где применяется свойство FocusedElement. В этом случае это сам экземпляр CCtl, который не может видеть внутри своего собственного шаблона. Установив свойство на что-то внутри шаблона, Binding может найти именованный элемент.
Ответ 2
Возможно, я ошибаюсь, но я думаю, что ваша проблема связана с триггером свойства.
С помощью фокуса TextBox
вы фактически аннулируете Trigger
на Templated Parent, поэтому триггер разворачивает и отменяет настройку фокуса на TextBox (поэтому не фокусируется на нем).