【问题标题】:Hiding the right click menu of an unfocusable WPF textbox隐藏无法聚焦的 WPF 文本框的右键菜单
【发布时间】:2012-01-03 11:56:00
【问题描述】:

在下面的 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;
        }
    }
}

【问题讨论】:

    标签: c# wpf textbox focus


    【解决方案1】:

    如果你不希望能够集中注意力,我想使用

    uiElement.IsHitTestVisible = false;
    

    属性还会阻止您显示上下文菜单。 它是一个依赖属性,因此您可以选择将其绑定到 Focusable 属性。

    我认为这比仅针对 ContextMenu 更可取,因为我认为您的功能要求是根本无法对文本框执行任何操作。

    回应@Dr。 Andrew Burnett-Thompson 我做了以下 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>
    

    【讨论】:

    • 我认为您没看错问题,但也许在 IsFocusable = false 时使用触发器设置 IsHitTestVisible = false 可以实现这一点? (如果 IsHitTestVisible=false 确实禁用了文本框)
    • IsHitTestVisibile 禁用文本框的任何输入并触发底层控件的点击事件,这可能不是我们想要的行为
    • @BasB 关于底层控件上的点击事件的说法是我没有想到的。这确实是应该考虑的事情。
    【解决方案2】:

    当文本框无法聚焦时,您可以使用 XAML 中的触发器将 TextBox 的 ContextMenu 的可见性设置为隐藏:

     <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>
    

    【讨论】:

      猜你喜欢
      • 2011-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-01
      相关资源
      最近更新 更多