【发布时间】: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