在WPF TextBox中禁用覆盖模式(按Insert键时)

时间:2013-08-20 20:50:37

标签: wpf textbox overwrite

当用户按下WPF TextBox中的Insert键时,控件在插入和覆盖模式之间切换。通常,这是通过使用不同的光标(线对块)可视化的,但这不是这里的情况。由于用户完全没有办法知道覆盖模式是活动的,我只想完全禁用它。当用户按下Insert键时(或者有意或无意地激活该模式),TextBox应该保持插入模式。

我可以添加一些按键事件处理程序并忽略所有这些事件,按下没有修饰符的Insert键。那就够了吗?你知道一个更好的选择吗?我的视图中有很多TextBox控件,我不想在任何地方添加事件处理程序......

2 个答案:

答案 0 :(得分:6)

您可以制作AttachedProperty并使用建议的ChrisF方法,这样就可以在您的应用中添加到TextBoxes

<强>的Xaml:

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

<强> AttachedProperty:

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

答案 1 :(得分:3)

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

在构造函数中:

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


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

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