0

大家好,

当我创建一个以编程方式打开上下文菜单的事件时,我从 WPF 中得到了一些奇怪的行为。一旦我选择了一个文本并右键单击,一旦上下文菜单打开,选择的突出显示就会消失。

这是问题的一个示例:

xml:

<Window x:Class="WpfApplication19.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1" Height="287" Width="419">
    <Grid>
        <TextBox x:Name="myText" Height="38" Margin="0,72,6,0" VerticalAlignment="Top" HorizontalAlignment="Right" Width="135"></TextBox>
        <Label Height="30" Margin="12,80,164,0" Name="label1" VerticalAlignment="Top">Textbox with contextMenu property set</Label>
        <Label Height="30" Margin="12,0,136,91" Name="label2" VerticalAlignment="Bottom">TextBox Open ContextMenu by programmatically</Label>
        <TextBox Height="38" Margin="0,0,6,81" x:Name="myText1" VerticalAlignment="Bottom" HorizontalAlignment="Right" Width="135" />
    </Grid>
</Window>

以及背后的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApplication19
{
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        ContextMenu con = new ContextMenu();
        public Window1()
        {
            InitializeComponent();
            MenuItem menuItem1 = new MenuItem();
            menuItem1.Header = "Menu1";
            MenuItem menuItem2 = new MenuItem();
            menuItem2.Header = "Menu2";

            con.Items.Add(menuItem1);
            con.Items.Add(menuItem2);

            this.myText.ContextMenu = con;

            this.myText1.PreviewMouseDown += new MouseButtonEventHandler(myText1_PreviewMouseDown);
        }

        void myText1_PreviewMouseDown(object sender, MouseButtonEventArgs e)
        {
            base.OnPreviewMouseDown(e);
            if (e.RightButton == MouseButtonState.Pressed)
            {
               con.Placement = System.Windows.Controls.Primitives.PlacementMode.MousePoint;

               con.IsOpen = true;
               IInputElement focusedElement = FocusManager.GetFocusedElement(this); 
            }
        }
    }
}

先感谢您!

注意:我发现添加 con.focusable = false 往往适用于解决方案。但有人能解释这是为什么吗?

4

3 回答 3

1

每当您打开上下文菜单时,焦点都会转到上下文菜单,这就是文本框将隐藏选择的原因。

这个问题的一个简单解决方案是:

将contextmenu 属性Focusable更改为 false

<ContextMenu Focusable="False">

并将每个项目的Focusable更改为 false

<MenuItem Command="Copy" Focusable="False">


简单的例子:

<TextBox Text="Right-click here for context menu!">
    <TextBox.ContextMenu>
        <ContextMenu Focusable="False">
            <MenuItem Command="Cut" Focusable="False"/>
            <MenuItem Command="Copy" Focusable="False"/>
            <MenuItem Command="Paste" Focusable="False"/>
        </ContextMenu>
    </TextBox.ContextMenu>
</TextBox>

这样,焦点将停留在文本框上,突出显示将保持可见

于 2016-05-17T10:04:00.550 回答
0

我可以让你开始,但是这个解决方案有一些你可能需要克服的严重的可用性问题。

  1. 添加一个 LostFocus 事件处理程序来控制 myText。
  2. 在右键事件期间设置 myText1.Focus() 以便触发 LostFocus 事件。

此解决方案意味着当您可能想要取消选择 myText 的值时,它会保持选中状态。

另请查看此答案以获取更多信息。

<TextBox LostFocus="myText_LostFocus" x:Name="myText" Height="38" Margin="0,72,6,0" VerticalAlignment="Top" HorizontalAlignment="Right" Width="135"></TextBox>

void myText1_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
  base.OnPreviewMouseDown(e);
  if (e.RightButton == MouseButtonState.Pressed)
  {
    // added next line
    myText1.Focus();
    con.Placement = System.Windows.Controls.Primitives.PlacementMode.MousePoint;

    con.IsOpen = true;
    IInputElement focusedElement = FocusManager.GetFocusedElement(this);
  }
}

private void myText_LostFocus(object sender, RoutedEventArgs e)
{
  e.Handled = true;
}
于 2011-02-16T04:20:23.367 回答
0

简单地说,属性 > 隐藏选择 = False

很高兴听到,你得到了正确的答案。但这也行得通谢谢

于 2015-01-11T17:00:06.090 回答