如何在自定义控件中重定向焦点

时间:2011-11-28 10:05:15

标签: wpf custom-controls

我从CustomControl继承:Control。它包含2个标签,1个TextBox和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>

由于用户应该能够浏览其中一些自定义控件,因此我希望通过我的控件选项卡重定向Focus。简单地说:

我想浏览所有这些文本框,只有那些(按钮应该没有制表位!)。

默认情况下禁用按钮和文本框,模板有一些触发器通过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 -->

提前感谢您的帮助!

编辑:我通过覆盖Control的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 个答案:

答案 0 :(得分:1)

与此同时,我自己找到了解决方案。别人可能会感兴趣:

由于我一直在使用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属性后,一切看起来都一样,并且完美运行。可能还有一个问题需要关注一个禁用的元素(取决于调用类本身中的setter,样式和代码的顺序)。