WPF使用AccessText类

时间:2016-02-21 09:02:46

标签: c# wpf xaml data-binding

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

  

如果您将AccessText与Label一起使用,并使用Target属性作为   TextBoxTextBox会在按下access key时获得焦点。请参见下面的代码:

<StackPanel>
    <Label Target="{Binding ElementName=txtbox}">
        <AccessText>_first_second</AccessText>
    </Label>
    <TextBox Name="txtbox" Width="100" Height="50"/>
</StackPanel>
  

如果您将AccessTextLabel一起使用,并使用Target属性作为   Buton,当Button被按下时,Click access key事件将被执行。

所以我的问题是

  

1. AccessText类的明确行为是什么?如果我必须预测它与DataGridComboBox等其他类型的控件一起使用,   RadioButton?我怎样才能确定预期结果?

     

2.为什么这个类派生自FrameworkElement?它有FrameworkElement的应用程序?似乎有点多了   只需指定Accesskeys等。

1 个答案:

答案 0 :(得分:11)

AccessTextFrameworkElement,其行为或多或少类似TextBlock的特殊类型,允许任何键盘字符跟随单个下划线(_)充当访问密钥。

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

protected virtual void OnAccessKey(AccessKeyEventArgs e)
{
    this.Focus();
}

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

ButtonBase继承自的ButtonOnAccessKey有以下定义:

protected override void OnAccessKey(AccessKeyEventArgs e)
{
    if (e.IsMultiple)
        base.OnAccessKey(e);
    else
        this.OnClick();
}

因此,Button和从ButtonBase继承的其他控件的默认行为是在IsMultiple为真时使控件成为焦点,否则会引发click事件。如果访问密钥与多个IsMultiple相关联,则UIElement为真。)

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

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

  2. OnAccessKeyOnAccessKey,原因与AccessTextFrameworkElement的原因相同。它具有可视化形式并占据布局系统在相对于其定位其他元素时需要考虑的空间。此外,TextBlock允许样式化,并且它们拥有自己的FrameworkElement属性,这允许绑定方案,否则将无法实现。如果FrameworkElements不是DataContext,则会不必要地限制并阻止WPF开发人员可能使用的合理(尽管可能很少见)用例。

  3. 修改

    以下是一个花式电源按钮示例,演示了AccessText作为FrameworkElement的有用性:

    AccessText

    这导致(在按下 Alt 之后):

    enter image description here

    单击按钮或按 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> 来响应命令,结果如下:

    enter image description here

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