【问题标题】:How to block or disable window shortcuts when the cursor is in textbox?当光标在文本框中时如何阻止或禁用窗口快捷方式?
【发布时间】:2019-05-10 07:16:33
【问题描述】:

我有 C# WPF 应用程序和带有功能区控件和文本框的窗口。功能区为窗口定义了许多键盘快捷键,例如F1D 等。当光标在文本框中时,按 D 键会调用与该快捷方式关联的函数,因此它是无法在文本框中写入字符 "D"。谁知道如何解决这个问题?

我试图覆盖PreviewKeyDown 事件,还找出在按键时触发了哪些事件并对其进行操作,但没有任何效果。

【问题讨论】:

  • 文本框在哪里?在功能区内,您必须使用RibbonTextBox。你能展示 xaml 和你的尝试吗?
  • 你没有正确解释很多事情。这些快捷方式的命令是如何实现的。文本框在哪里。为什么功能区要定义窗口的键盘快捷键?您应该将诸如 Alt+D 之类的关键和弦与 D 应该做的任何事情联系起来。

标签: c# wpf textbox ribbon-control


【解决方案1】:

这是一个快速而肮脏的示例,旨在说明通常如何实现快捷键。

显然。

这非常简化,我的命令并没有做太多。

你可以在任一文本框中输入 D,没问题。

主窗口中的标记。

<Window.DataContext>
    <local:MainWindowViewModel/>
</Window.DataContext>
<Window.InputBindings>
    <KeyBinding Key="D"
          Modifiers="Alt" 
          Command="{Binding MyDcommand}" />
</Window.InputBindings>
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <Ribbon>
        <RibbonGroup>
            <TextBox Text="Hello"/>
        </RibbonGroup>
    </Ribbon>
    <TextBox Height="30" 
             Width="100"
             Grid.Row="1"/>
</Grid>

我在视图模型中使用 mvvmlight,因此很容易定义 icommand。

using GalaSoft.MvvmLight.CommandWpf;
namespace wpf_99
{
public class MainWindowViewModel : BaseViewModel
{
    private RelayCommand myDcommand;
    public RelayCommand MyDcommand
    {
        get
        {
            return myDcommand
            ?? (myDcommand = new RelayCommand(
              () =>
              {
                  Console.WriteLine("It worked OK");
              }
             ));
        }
    }

当我按下 Alt+D 时,无论文本框是否聚焦,命令都会触发。

该命令的范围是窗口,而不仅仅是功能区。因此,如果焦点位于窗口中的任何位置,它就可以工作。

我可以输入一个 D

【讨论】:

    猜你喜欢
    • 2015-02-06
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多