我今天正在上课AccessText
。我无法确定使用此课程的确切用法和结果。
如果您将
AccessText
与Label一起使用,并使用Target
属性作为TextBox
,TextBox
会在按下access key
时获得焦点。请参见下面的代码:
<StackPanel>
<Label Target="{Binding ElementName=txtbox}">
<AccessText>_first_second</AccessText>
</Label>
<TextBox Name="txtbox" Width="100" Height="50"/>
</StackPanel>
如果您将
AccessText
与Label
一起使用,并使用Target属性作为Buton
,当Button
被按下时,Click
access key
事件将被执行。
所以我的问题是
1.
AccessText
类的明确行为是什么?如果我必须预测它与DataGrid
,ComboBox
等其他类型的控件一起使用,RadioButton
?我怎样才能确定预期结果?2.为什么这个类派生自
FrameworkElement
?它有FrameworkElement
的应用程序?似乎有点多了 只需指定Accesskeys等。
答案 0 :(得分:11)
AccessText
是FrameworkElement
,其行为或多或少类似TextBlock
的特殊类型,允许任何键盘字符跟随单个下划线(_
)充当访问密钥。
对于给定的控件,关联的访问键的行为取决于其OnAccessKey
方法。 OnAccessKey
是UIElement
的虚拟方法,它提供以下定义:
protected virtual void OnAccessKey(AccessKeyEventArgs e)
{
this.Focus();
}
因此,任何不覆盖OnAccessKey
定义的UIElement
定义的控件都将保持默认行为,即当按下访问键时控件将被聚焦。
ButtonBase
继承自的Button
对OnAccessKey
有以下定义:
protected override void OnAccessKey(AccessKeyEventArgs e)
{
if (e.IsMultiple)
base.OnAccessKey(e);
else
this.OnClick();
}
因此,Button
和从ButtonBase
继承的其他控件的默认行为是在IsMultiple
为真时使控件成为焦点,否则会引发click事件。如果访问密钥与多个IsMultiple
相关联,则UIElement
为真。)
考虑到这一背景,以下是您具体问题的答案:
用作控件AccessText
的{{1}}元素的确定行为是使用ContentPresenter
注册单个下划线后面的第一个字母,这将调用控件{按下键时的方法{1}}。知道这将对特定控件做什么需要知道AccessKeyManager
的哪个定义对该控件有效。如果其继承链中没有覆盖,则按下访问键将使控件成为焦点。如果存在覆盖,则行为将取决于覆盖方法的定义。这可以通过实验,阅读相关文档或检查源代码来确定。
OnAccessKey
为OnAccessKey
,原因与AccessText
为FrameworkElement
的原因相同。它具有可视化形式并占据布局系统在相对于其定位其他元素时需要考虑的空间。此外,TextBlock
允许样式化,并且它们拥有自己的FrameworkElement
属性,这允许绑定方案,否则将无法实现。如果FrameworkElements
不是DataContext
,则会不必要地限制并阻止WPF开发人员可能使用的合理(尽管可能很少见)用例。
修改强>
以下是一个花式电源按钮示例,演示了AccessText
作为FrameworkElement
的有用性:
AccessText
这导致(在按下 Alt 之后):
单击按钮或按 Alt + S 后,视图模型将通过更改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>
来响应命令,结果如下:
再次单击或使用访问键将返回第一个状态。