按钮中的 WPF AccessText 仅适用于 Alt

Posted

技术标签:

【中文标题】按钮中的 WPF AccessText 仅适用于 Alt【英文标题】:WPF AccessText In Button Only For Alt 【发布时间】:2014-09-02 14:24:19 【问题描述】:

我有一个 WPF 窗口 (.NET 4.0),它使用 ShowDialog() 作为对话框打开另一个 WPF 窗口。在那个对话框窗口上,我有一个保存和取消按钮,我想分别连接 alt+S 和 alt+C 来保存和取消快捷方式。

我在按钮中有一个AccessText 元素,该元素在设计器中下划线后面的字母的按钮上显示下划线。这在用户按下 alt 键时有效。当用户按下访问键时,快捷方式也在工作。

但是,问题如下:

访问密钥无需 alt 即可工作。对话框打开后,我可以只按字母 SC 而没有 alt 并触发按钮单击事件。如果焦点位于输入控件(即文本框)上,则它仅适用于 alt,这正是我想要的。但是,我只希望在表单具有焦点时访问键与 alt 一起使用。

第一次按下 alt 后,下划线将永远出现在按钮文本中,除非您开始输入输入控件(即文本框)。如果我再次按下 alt,我会希望它们隐藏起来。这对 WPF 来说正常吗?

这是从主窗口调用对话框的代码:

    private void Button_Click(object sender, RoutedEventArgs e)
    
        var w = new DialogWindow();
        w.ShowDialog();
    

这是对话框窗口中的 XAML:

    <Window x:Class="WpfApplication2.DialogWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="Window1" Height="122" Width="330" Topmost="True">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>

            <StackPanel Orientation="Horizontal">
                <TextBlock Text="Some Setting:" Margin="10"/>
                <TextBox  Width="200" Margin="2" />
            </StackPanel>

            <StackPanel Grid.Row="1" Orientation="Horizontal" HorizontalAlignment="Right">
                <Button Name="btnSave" Margin="10,10,5,10" Width="100" Height="25" Click="btnSave_Click" >
                    <StackPanel Orientation="Horizontal">
                        <Image Source="pack://siteoforigin:,,,/save_16xLG.png" />
                        <AccessText Text="_Save" />
                    </StackPanel>
                </Button>
                <Button Name="btnCancel" Margin="5,10,10,10" Width="100" Height="25" Click="btnCancel_Click">
                    <StackPanel Orientation="Horizontal">
                        <Image Source="pack://siteoforigin:,,,/action_Cancel_16xLG.png" />
                        <AccessText Text="_Cancel" />
                    </StackPanel>
                </Button>
            </StackPanel>
        </Grid>
    </Window>

下面是对话框窗口的代码:

    public partial class DialogWindow : Window
    
        public DialogWindow()
        
            InitializeComponent();
        

        private void btnCancel_Click(object sender, RoutedEventArgs e)
        
            this.DialogResult = false;
            this.Close();
        

        private void btnSave_Click(object sender, RoutedEventArgs e)
        
            this.DialogResult = true;
            this.Close();
        
    

【问题讨论】:

【参考方案1】:

ALT 时不会隐藏。当焦点切换到另一个控件时它会隐藏。

当您在任何一个文本框中都没有焦点时,您将焦点放在按钮上。根据设计,当焦点位于按钮上时,WPF 会响应热键,即使您没有按 Alt

请参阅此答案以了解解决方法:

Access key getting selected even we did not press 'Alt' key in WPF

【讨论】:

我尝试添加第二个文本框,当通过鼠标单击将焦点从一个控件切换到另一个控件时,下划线会隐藏,但通过 Tab 切换焦点无效。此外,如果我按下“S”或“C”,表单仍会立即关闭,无论我是否按下了 ALT,如果其中一个文本框没有焦点。 解决方法的链接提供了我需要的答案,以防止访问键工作,除非按下 ALT。谢谢!

以上是关于按钮中的 WPF AccessText 仅适用于 Alt的主要内容,如果未能解决你的问题,请参考以下文章

WPF:如何防止讲述人读取 AccessText 元素的下划线字符?

如何使按钮(输入)仅适用于 html 中的一个文本框?

WPF:为啥我不应该在 ControlTemplate 中使用 TemplateBinding Margin - Margin 是不是仅适用于元素的容器?

Javascript函数仅适用于表格的第一行[重复]

防火墙中的入站规则仅适用于管理员权限

仅适用于下拉按钮的水平滚动