5

当用户在 WPF 文本框中按下 Insert 键时,控件会在插入和覆盖模式之间切换。通常,这是通过使用不同的光标(行与块)来可视化的,但这里不是这种情况。由于用户绝对无法知道覆盖模式处于活动状态,因此我只想完全禁用它。当用户按下 Insert 键(或者可能有意或无意地激活该模式)时,TextBox 应该简单地保持在插入模式。

我可以添加一些按键事件处理程序并忽略所有此类事件,按下不带修饰符的插入键。这样就够了吗?你知道更好的选择吗?我的视图中有许多 TextBox 控件,我不想到处添加事件处理程序......

4

2 回答 2

7

您可以制作AttachedProperty并使用ChrisF建议的方法,这样可以轻松添加到TextBoxes您想要的应用程序中

xml:

   <TextBox Name="textbox1" local:Extensions.DisableInsert="True" />

附加属性:

public static class Extensions
{
    public static bool GetDisableInsert(DependencyObject obj)
    {
        return (bool)obj.GetValue(DisableInsertProperty);
    }

    public static void SetDisableInsert(DependencyObject obj, bool value)
    {
        obj.SetValue(DisableInsertProperty, value);
    }

    // Using a DependencyProperty as the backing store for MyProperty.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty DisableInsertProperty =
        DependencyProperty.RegisterAttached("DisableInsert", typeof(bool), typeof(Extensions), new PropertyMetadata(false, OnDisableInsertChanged));

    private static void OnDisableInsertChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        if (d is TextBox && e != null)
        {
            if ((bool)e.NewValue)
            {
                (d as TextBox).PreviewKeyDown += TextBox_PreviewKeyDown;
            }
            else
            {
                (d as TextBox).PreviewKeyDown -= TextBox_PreviewKeyDown;
            }
        }
    }

    static void TextBox_PreviewKeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Insert && e.KeyboardDevice.Modifiers == ModifierKeys.None)
        {
            e.Handled = true;
        }
    }
于 2013-08-20T21:48:30.967 回答
4

为了避免在任何地方添加处理程序,您可以子类化TextBox并添加一个PreviewKeyDown按照您的建议执行的事件处理程序。

在构造函数中:

public MyTextBox()
{
    this.KeyDown += PreviewKeyDownHandler;
}


private void PreviewKeyDownHandler(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Insert)
    {
        e.Handled = true;
    }
}

但是,这确实意味着您需要将 XAML 中的所有用法替换为TextBoxwith MyTextBox,因此不幸的是,无论如何您都必须编辑所有视图。

于 2013-08-20T21:12:29.253 回答