WPF使用AccessText类的预期结果

Kyl*_*Ren 9 c# data-binding wpf xaml

AccessText今天正在上课.我无法确定使用此类的确切用法和结果.

如果您使用AccessTextLabel并使用Target属性作为a TextBox,则TextBoxaccess key按下时将获得焦点.请参见下面的代码:

<StackPanel>
    <Label Target="{Binding ElementName=txtbox}">
        <AccessText>_first_second</AccessText>
    </Label>
    <TextBox Name="txtbox" Width="100" Height="50"/>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)

如果您使用AccessTexta Label并使用Target属性作为a Buton,则Button Clickaccess key按下时将执行该事件.

所以我的问题是

1.班级的决定性行为是AccessText什么?如果非要预测它与其他类型的控件一样使用DataGrid,ComboBox, RadioButton?我怎么能确定预期的结果?

这个班级为什么来自FrameworkElement?它有什么应用程序FrameworkElement?对于仅指定Accesskeys等似乎更多一些

dev*_*xer 12

AccessText是一种FrameworkElement特殊类型的行为,TextBlock它允许单个下划线(_)后面的任何键盘字符充当访问键.

对于给定的控件,关联的访问键的行为取决于其OnAccessKey方法.OnAccessKey是一个虚拟方法UIElement,它提供以下定义:

protected virtual void OnAccessKey(AccessKeyEventArgs e)
{
    this.Focus();
}
Run Code Online (Sandbox Code Playgroud)

因此,任何不覆盖定义的OnAccessKey定义的控件都UIElement将保持默认行为,即当按下访问键时控件将被聚焦.

ButtonBase,Button继承自,具有以下定义OnAccessKey:

protected override void OnAccessKey(AccessKeyEventArgs e)
{
    if (e.IsMultiple)
        base.OnAccessKey(e);
    else
        this.OnClick();
}
Run Code Online (Sandbox Code Playgroud)

因此Button,继承的默认行为和其他控件ButtonBase将使控件成为焦点,如果IsMultiple为true,否则,它将引发click事件.(IsMultiple如果访问密钥与多个密钥相关联,则为true UIElement.)

考虑到这一背景,以下是您具体问题的答案:

  1. AccessText用作控件的元素的确定行为ContentPresenter是将单个下划线后面的第一个字母注册到AccessKeyManager,这将在OnAccessKey按下键时调用控件的方法.知道这将对特定控件做什么需要知道该控件的哪个定义OnAccessKey有效.如果其继承链中没有覆盖,则按下访问键将使控件成为焦点.如果存在覆盖,则行为将取决于覆盖方法的定义.这可以通过实验,阅读相关文档或检查源代码来确定.

  2. AccessTextFrameworkElement的,同样的原因TextBlockFrameworkElement.它具有可视化形式并占据布局系统在相对于其定位其他元素时需要考虑的空间.此外,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>
Run Code Online (Sandbox Code Playgroud)

这导致(按下之后Alt):

在此输入图像描述

单击按钮或按Alt+后S,视图模型将通过更改Text和响应命令Fill,从而产生以下结果:

在此输入图像描述

再次单击或使用访问键将返回到第一个状态.

  • *WPF开发人员可能需要在AccessText类中绑定什么?*绝对是`Text`属性,可能还有`Margin`,`Foreground`,`FontWeight`和`FontStyle`.*我知道我可以为访问文本类设置一个布局但是有必要吗?*我将添加一个示例.我听说你只是为了这个目的而拥有一个特殊的`FrameworkElement`是一个奇怪的设计选择.我不确定为什么他们不只是将`RecognizesAccessKey`属性添加到`TextBlock`并将其称为一天. (2认同)