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



我从:Control继承了一个CustomControl。它包含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>

实际上,这个触发器适用于按钮(我可以看到样式改变和改变后失去焦点),但我的文本框仍然是启用的(至少样式不改变)

与此同时,我自己找到了解决办法。其他人可能会感兴趣:

由于我一直在玩弄IsEnabled并将焦点设置为输入字段,我认为在我的控件类中的触发器,样式和函数调用的顺序中可能存在一些问题。不管怎样,我用下面的方法解决了它:

我删除了这三个setter

<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属性之后,一切看起来都一样,并且工作完美。关注一个禁用的元素可能会有问题(取决于调用Class本身中的setter、样式和代码的顺序)。

最新更新