Как перенаправить Фокус в пользовательский элемент управления - PullRequest
0 голосов
/ 28 ноября 2011

Я получил наследование CustomControl от: Control. Он содержит 2 метки, 1 текстовое поле и 2 кнопки (простой вид)

<Button IsTabStop="False" x:Name="ParameterUpButton" IsEnabled="False" Width="14" Height="10">
<Button IsTabStop="False" x:Name="ParameterDownButton" IsEnabled="False" Width="14" Height="10"/>

<StackPanel Orientation="Horizontal" Height="28" VerticalAlignment="Center">
   <Label Content="{TemplateBinding ParameterName}" Width="45" />
   <TextBox IsEnabled="False" x:Name="ParameterValueTextBox" Text="{TemplateBinding ParameterValue}" Width="36" Height="23"/>
   <Label Content="{TemplateBinding ParameterUnit}" Width="33" />
</StackPanel>

Поскольку пользователь должен иметь возможность перемещаться по некоторым из этих пользовательских элементов управления, я хочу перенаправить фокус, переключаясь между своими элементами управления. Просто сказал:

Я хочу перемещаться по всем этим текстовым полям, и только по тем (кнопки не должны быть табуляцией!).

Кнопки и текстовое поле по умолчанию отключены, и шаблон получил несколько триггеров для их включения с помощью IsMouseOver и IsKeyboardFocused (для отображения другого стиля).

Как мне сфокусировать текстовое поле (и включить его, включая две кнопки)

  • использовать Tab для навигации по моим элементам управления?
  • , нажав на мой элемент управления (независимо от того, где, только внутри элемента управления)

Использование выглядит следующим образом:

<!-- some more controls -->
<CustomControls:ParameterControl ParameterName="foo" ParameterUnit="x" ParameterValue="6" Margin="5"/>
<CustomControls:ParameterControl ParameterName="bar" ParameterUnit="y" ParameterValue="6" Margin="5"/>
<CustomControls:ParameterControl ParameterName="foobar" ParameterUnit="z" ParameterValue="6" Margin="5"/>
<!-- some more controls -->

Заранее спасибо за любую помощь!

Редактировать: Я попробовал это, переопределив событие OnGotFocus элемента управления, как это:

protected override void OnGotFocus(RoutedEventArgs e)
{
      var tb = ((TextBox) Template.FindName("ParameterValueTextBox", this));
      tb.IsEnabled = true;
      tb.Focus();
}

Я также написал триггер для моего элемента управления:

<MultiTrigger>
   <MultiTrigger.Conditions>
      <Condition SourceName="ParameterValueTextBox" Property="IsKeyboardFocused" Value="true"/>
   </MultiTrigger.Conditions>
   <MultiTrigger.Setters>
      <Setter Property="IsEnabled" TargetName="ParameterDownButton" Value="true"/>
      <Setter Property="IsEnabled" TargetName="ParameterUpButton" Value="true"/>
      <Setter Property="IsEnabled" TargetName="ParameterValueTextBox" Value="true"/>
   </MultiTrigger.Setters>
</MultiTrigger>

На самом деле, этот триггер работает для кнопок (я могу видеть, как стиль меняется и возвращается обратно после потери фокуса), но мой TextBox все еще включен (по крайней мере, стиль не меняется обратно)

1 Ответ

1 голос
/ 02 декабря 2011

Тем временем я сам нашел решение.Возможно, это будет интересно кому-то еще:

Поскольку я жонглировал с IsEnabled и устанавливал фокус на поле ввода, я думаю, что могут быть некоторые проблемы в порядке триггеров, стилей и вызовов функций.в классе моего контроля.Во всяком случае, я решил это следующим образом:

Я удалил эти три сеттера

<MultiTrigger.Setters>
  <Setter Property="IsEnabled" TargetName="ParameterDownButton" Value="true"/>
  <Setter Property="IsEnabled" TargetName="ParameterUpButton" Value="true"/>
  <Setter Property="IsEnabled" TargetName="ParameterValueTextBox" Value="true"/>
</MultiTrigger.Setters>

до

<MultiTrigger.Setters>
  <Setter Property="Tag" TargetName="ParameterDownButton" Value="Enabled"/>
  <Setter Property="Tag" TargetName="ParameterUpButton" Value="Enabled"/>
  <Setter Property="Tag" TargetName="ParameterValueTextBox" Value="Enabled"/>
</MultiTrigger.Setters>

И включил кнопки все время.После применения триггеров стиля к свойству Tag все выглядит одинаково и работает отлично.Еще может быть проблема с фокусировкой отключенного элемента (зависит от порядка вызова сеттеров, стилей и кода внутри самого класса).

...