Выделенный текст исчезает при всплывающем контекстном меню - PullRequest
0 голосов
/ 15 февраля 2011

Greetings All,

Я получаю странное поведение от WPF, когда создаю событие для программного открытия контекстного меню.после выбора текста и щелчка правой кнопкой мыши выделение выделения исчезает, как только открывается контекстное меню.

Вот пример проблемы:

Xaml:

<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 имеет тенденцию работать с решением.но кто-нибудь может объяснить, почему это так?

Ответы [ 3 ]

1 голос
/ 17 мая 2016

Всякий раз, когда вы открываете контекстное меню, фокус переходит к контекстному меню, и именно поэтому текстовое поле будет скрывать выделение.

Простое решение этой проблемы:

Изменить свойство contextmenu Focusable на false

<ContextMenu Focusable="False">

И изменить Фокусируемый для каждого элемента на 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>

Таким образом, фокус останется на текстовом поле, и основной момент останется Видимый

0 голосов
/ 11 января 2015

Просто, Свойства> Скрыть выделение = Ложь

Приятно слышать, вы получили правильный ответ. но просто это тоже работает Спасибо

0 голосов
/ 16 февраля 2011

Я могу начать, но у этого решения есть некоторые серьезные проблемы с юзабилити, которые вам, возможно, придется решить.

  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;
}
...