如何在RichEditBox中覆盖键盘快捷方式?

4
有没有办法禁用或覆盖WinRT RichEditBox控件上的键盘快捷键?我想要禁用当你按下Ctrl-B和Ctrl-I时的加粗和斜体格式。

我避免使用普通的TextBox,因为我想要使用RichEditBox中的格式选项来给文本添加语法高亮。如果用户可以在框内操作样式,那么这种方法就不行了。

谢谢!

你尝试过以下问题中的解决方案吗:http://stackoverflow.com/questions/260716/override-shortcut-keys-on-net-richtextbox - jsirr13
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Courtney
你可以尝试处理 RichExitBoxKeyDown 事件,并且丢弃相应的控制键。 - dbc
@dbc 我已经尝试将 KeyRoutedEventArgsHandled 属性在 KeyDownKeyUp 事件中都设置为 true。这样可以防止我在框中输入任何内容...但我仍然能够将已经存在的文本加粗和斜体化。 - Courtney
也许可以参考这个链接:http://stackoverflow.com/questions/21203494/richeditbox-using-ctrli-to-set-italic-text-deletes-the-text。你可以尝试使用这个链接来检查控制键是否被按下:https://dev59.com/uWcs5IYBdhLWcg3wRBtQ。 - dbc
@dbc 我已经尝试过这些,可能有一些希望可以检测何时覆盖键命令。我面临的问题是,即使我让它工作了,我也不知道如何实际上覆盖键命令。这就是将 Handled 设置为 true 应该完成的工作,对于除加粗和斜体文本之外的所有内容都有效。 - Courtney
1个回答

2
最终我在另一个问题中找到了答案:文本控件的OnKeyDown方法会在KeyDown事件被触发之前调用,因此你不能侦听KeyDown事件,而是必须创建RichEditBox的子类并重写OnKeyDown方法。然后在你的XAML标记或任何实例化RichEditBox的地方,使用你自定义的子类代替即可。作为一个有点相关的例子,我创建了一个TextBox的覆盖,防止了撤销和重做操作:
[Windows::Foundation::Metadata::WebHostHidden]
public ref class BetterTextBox sealed : public Windows::UI::Xaml::Controls::TextBox
{
public:
    BetterTextBox() {}
    virtual ~BetterTextBox() {}
    virtual void OnKeyDown(Windows::UI::Xaml::Input::KeyRoutedEventArgs^ e) override
    {
        Windows::System::VirtualKey key = e->Key;
        Windows::UI::Core::CoreVirtualKeyStates ctrlState = Windows::UI::Core::CoreWindow::GetForCurrentThread()->GetKeyState(Windows::System::VirtualKey::Control);
        if ((key == Windows::System::VirtualKey::Z || key == Windows::System::VirtualKey::Y) &&
            ctrlState != Windows::UI::Core::CoreVirtualKeyStates::None)
        {
            e->Handled = true;
        }

        // only call the base implementation if we haven't already handled the input
        if (!e->Handled)
        {
            Windows::UI::Xaml::Controls::TextBox::OnKeyDown(e);
        }
    }
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接