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
相关产品推荐
相关产品推荐

