You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UWP中替换RichEditBox默认Menu Flyout为自定义菜单问题

解决RichEditBox自定义上下文菜单不生效的问题

RichEditBox内置了文本编辑相关的默认上下文菜单逻辑,直接设置ContextFlyout无法覆盖默认菜单,需要通过以下两种方式处理:

方案一:禁用默认菜单后设置自定义ContextFlyout

在创建RichEditBox时添加IsContextMenuEnabled = false禁用默认菜单,再绑定自定义菜单即可生效,同时建议为菜单项绑定实际功能:

public sealed partial class MainPage : Page
{
    RichEditBox box1;
    MenuFlyout myContextMenu;
    public MainPage()
    {
        this.InitializeComponent();

        box1 = new RichEditBox()
        {
            Width = 500,
            Height = 30,
            BorderBrush = new SolidColorBrush(Colors.Blue),
            BorderThickness = new Thickness(1, 1, 1, 1),
            IsContextMenuEnabled = false // 禁用默认上下文菜单
        };

        myContextMenu = new MenuFlyout();
        
        // 剪切菜单项
        MenuFlyoutItem cutMenuItem = new MenuFlyoutItem() { Text = "剪切" };
        cutMenuItem.Click += (s, e) => box1.Document.Selection.Cut();
        myContextMenu.Items.Add(cutMenuItem);
        
        // 复制菜单项
        MenuFlyoutItem copyMenuItem = new MenuFlyoutItem() { Text = "复制" };
        copyMenuItem.Click += (s, e) => box1.Document.Selection.Copy();
        myContextMenu.Items.Add(copyMenuItem);
        
        // 粘贴菜单项
        MenuFlyoutItem pasteMenuItem = new MenuFlyoutItem() { Text = "粘贴" };
        pasteMenuItem.Click += (s, e) => box1.Document.Selection.Paste(Windows.ApplicationModel.DataTransfer.PasteFormatOptions.All);
        myContextMenu.Items.Add(pasteMenuItem);
        
        // 全选菜单项
        MenuFlyoutItem selectAllMenuItem = new MenuFlyoutItem() { Text = "全选" };
        selectAllMenuItem.Click += (s, e) => box1.Document.SelectAll();
        myContextMenu.Items.Add(selectAllMenuItem);

        box1.ContextFlyout = myContextMenu;
        Content = box1;
    }
}

方案二:通过ContextRequested事件手动控制菜单弹出

如果需要更灵活的控制(比如根据选中内容动态调整菜单),可以绑定ContextRequested事件,在事件中显示自定义菜单并阻止默认菜单弹出:

public sealed partial class MainPage : Page
{
    RichEditBox box1;
    MenuFlyout myContextMenu;
    public MainPage()
    {
        this.InitializeComponent();

        box1 = new RichEditBox()
        {
            Width = 500,
            Height = 30,
            BorderBrush = new SolidColorBrush(Colors.Blue),
            BorderThickness = new Thickness(1, 1, 1, 1)
        };

        myContextMenu = new MenuFlyout();
        
        // 创建菜单项并绑定功能
        MenuFlyoutItem cutMenuItem = new MenuFlyoutItem() { Text = "剪切" };
        cutMenuItem.Click += (s, e) => box1.Document.Selection.Cut();
        myContextMenu.Items.Add(cutMenuItem);
        
        MenuFlyoutItem copyMenuItem = new MenuFlyoutItem() { Text = "复制" };
        copyMenuItem.Click += (s, e) => box1.Document.Selection.Copy();
        myContextMenu.Items.Add(copyMenuItem);
        
        MenuFlyoutItem pasteMenuItem = new MenuFlyoutItem() { Text = "粘贴" };
        pasteMenuItem.Click += (s, e) => box1.Document.Selection.Paste(Windows.ApplicationModel.DataTransfer.PasteFormatOptions.All);
        myContextMenu.Items.Add(pasteMenuItem);
        
        MenuFlyoutItem selectAllMenuItem = new MenuFlyoutItem() { Text = "全选" };
        selectAllMenuItem.Click += (s, e) => box1.Document.SelectAll();
        myContextMenu.Items.Add(selectAllMenuItem);

        // 绑定上下文请求事件
        box1.ContextRequested += Box1_ContextRequested;
        Content = box1;
    }

    private void Box1_ContextRequested(UIElement sender, ContextRequestedEventArgs args)
    {
        // 在点击位置显示自定义菜单
        myContextMenu.ShowAt(box1, args.GetPosition(box1));
        // 标记事件已处理,阻止默认菜单弹出
        args.Handled = true;
    }
}

内容的提问来源于stack exchange,提问作者pavan kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 03:42:45