Скрытие меню правой кнопки мыши на не сфокусированном текстовом поле WPF - PullRequest
2 голосов
/ 03 января 2012

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

<Window x:Class="TextBoxApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <StackPanel>
            <Button Click="Button_OnClick"></Button>
            <TextBox Focusable="False" Name="myTextBox"></TextBox>
        </StackPanel>
    </Grid>
</Window>

using System.Windows;  
using System.Windows.Input;

namespace TextBoxApp  
{    
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_OnClick(object sender, RoutedEventArgs e)
        {
            myTextBox.Focusable = !myTextBox.Focusable;
        }
    }
}

Ответы [ 2 ]

3 голосов
/ 03 января 2012

Вы можете установить видимость ContextMenu TextBox в Hidden, когда текстовое поле не фокусируется с помощью триггера в XAML:

 <TextBox Name="textBox1" Focusable="False">
            <TextBox.Style>
                <Style TargetType="TextBox">
                    <Style.Triggers>
                        <Trigger Property="Focusable" Value="false">
                            <Setter Property="ContextMenu.Visibility" Value="Hidden" />
                        </Trigger>                        
                    </Style.Triggers>
                </Style>
            </TextBox.Style>
        </TextBox>
3 голосов
/ 03 января 2012

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

uiElement.IsHitTestVisible = false;

также не позволит вам отобразить контекстное меню.Это свойство зависимости, поэтому вы можете связать его со свойством Focusable.

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

В ответ на @Dr.Эндрю Бернетт-Томпсон: Я сделал следующий пример Xaml:

    <TextBox Focusable="False">
        <TextBox.Style>
            <Style TargetType="TextBox">
                <Style.Triggers>
                    <Trigger Property="Focusable" Value="False">
                        <Setter Property="IsHitTestVisible" Value="False"/>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </TextBox.Style>
    </TextBox>
...