我从: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、样式和代码的顺序)。