AccessText
是一个FrameworkElement
,它的行为基本上类似于一种特殊类型的TextBlock
,允许单个下划线(_
)后面的任何键盘字符作为访问键。
对于给定的控件,关联访问键的行为取决于其OnAccessKey
方法。 OnAccessKey
是UIElement
的虚拟方法,它提供以下定义:
protected virtual void OnAccessKey(AccessKeyEventArgs e)
{
this.Focus();
}
因此,任何不覆盖由UIElement
定义的OnAccessKey
的控件都将保留默认行为,即在按下访问键时将控件带入焦点。
Button
继承自ButtonBase
,ButtonBase
对OnAccessKey
有以下定义:
protected override void OnAccessKey(AccessKeyEventArgs e)
{
if (e.IsMultiple)
base.OnAccessKey(e);
else
this.OnClick();
}
如果IsMultiple
为true,则Button
和其他继承自ButtonBase
的控件的默认行为将是将控件置于焦点,否则,它会引发单击事件(如果与多个UIElement
关联一个访问键,则IsMultiple
为真)。
鉴于此背景,以下是针对您具体问题的答案:
作为控件的ContentPresenter
使用时,AccessText
元素的明确定义行为是将在单个下划线后面注册第一个字母到AccessKeyManager
,当按下该键时,将调用控件的OnAccessKey
方法。了解这将对特定控件做什么需要知道该控件所使用的OnAccessKey
的定义方式。如果在其继承链中没有重写,则按访问键将使控件获得焦点。如果有一个重写,则行为将取决于重写方法的定义。可以通过实验、阅读相关文档或检查源代码来确定这一点。
AccessText
之所以是FrameworkElement
与TextBlock
相同的原因是因为它有一个视觉形式,并且占用布局系统在定位其他元素时需要考虑的空间。此外,FrameworkElements
允许进行样式设置,并且具有自己的DataContext
属性,这允许绑定方案,否则将不可能实现。如果AccessText
不是FrameworkElement
,那么它将是不必要的限制,并且会阻止WPF开发人员可能具有的合理(尽管可能很少见)用例。
编辑
以下是一个漂亮的电源按钮示例,展示了AccessText
作为FrameworkElement
的有用性:
<Grid>
<Button Width="150"
Height="35"
Command="{Binding PowerCommand}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="Status" />
<Rectangle Margin="5,2,0,0"
Width="10"
Height="10"
Fill="{Binding PowerFill}" />
<AccessText Margin="25,0,0,0"
Text="{Binding PowerText}" />
</StackPanel>
</Button>
</Grid>
这将导致(按下Alt后):
点击按钮或按下Alt+S后,视图模型会响应该命令并更改Text
和Fill
,从而导致以下结果:
再次单击或使用访问键将返回到第一状态。