我从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启用它们(以显示不同的样式)。
如何关注文本框(并启用它包括两个按钮)
用法如下所示:
<!-- 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仍然被启用(至少样式不会改变)
答案 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,样式和代码的顺序)。