【问题标题】:How to redirect the Focus within a custom Control如何在自定义控件中重定向焦点
【发布时间】:2011-12-02 15:36:24
【问题描述】:

我有一个 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 仍然处于启用状态(至少样式不会变回)

【问题讨论】:

    标签: wpf custom-controls


    【解决方案1】:

    同时,我自己也找到了解决方案。其他人可能会感兴趣:

    由于我一直在处理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 属性后,一切看起来都一样并且工作正常。聚焦禁用的元素可能会出现其他问题(取决于调用类本身中的设置器、样式和代码的顺序)。

    【讨论】:

      猜你喜欢
      • 2018-01-11
      • 1970-01-01
      • 2012-10-22
      • 2014-02-20
      • 1970-01-01
      • 1970-01-01
      • 2011-09-21
      • 1970-01-01
      • 2012-01-24
      相关资源
      最近更新 更多