visual studio扩展键处理器,抑制输入键的默认行为

时间:2015-03-02 14:23:18

标签: c# visual-studio keyevent visual-studio-extensions visual-studio-addins

我正在开发一个Visual Studio扩展,它试图抑制Enter / Return键的默认行为(将插入符号更改为下一行)。所以我可以做一些自定义操作,例如在关闭括号(如Eclipse)之前按下输入时将插入符号移动到最后

[Export(typeof(IKeyProcessorProvider))]
[TextViewRole(PredefinedTextViewRoles.PrimaryDocument)]
[ContentType("any")]
[Name("ToTheEndKeyProvider")]
[Order(Before="default")]
internal class ToTheEndKeyProvider : IKeyProcessorProvider
{
    [ImportingConstructor]
    public ToTheEndKeyProvider()
    {

    }

    public KeyProcessor GetAssociatedProcessor(IWpfTextView wpfTextView)
    {
        if (wpfTextView == null)
            return null;
        return new ToTheEndKeyProcessor(wpfTextView,wpfTextView.TextBuffer) as KeyProcessor;
    } 
}

class ToTheEndKeyProcessor : KeyProcessor
{
    IWpfTextView view { get; set; }
    ITextBuffer buffer { get; set; }

    public ToTheEndKeyProcessor(IWpfTextView wpfTextView,ITextBuffer textBuffer)
    {
        this.view = wpfTextView;
        this.buffer = textBuffer;
    }

    public override void PreviewKeyDown(KeyEventArgs e)
    {                            
        if (e.Key.Equals(Key.Enter))
        {
             e.Handled = true;
        }
    }
}

问题在于:

  • 当覆盖PreviewKeyDown / KeyDown时,输入key not fire,其他键可以执行
  • 当覆盖PreviewKeyUp / KeyUp时,输入键被触发,但e.Handled = true无法抑制默认行为

我也试过了PreviewTextInput,但似乎可以得到'\ r'char。 是否有任何解决方案可以在没有KeyProcessor的情况下处理编辑器的关键事件。

1 个答案:

答案 0 :(得分:0)

我有完全相同的问题。

我还没有找到使用KeyProcessor处理Enter / Return键输入的方法,但是通过实现IOleCommandTarget,我可以处理它。 请参考以下文章:

http://www.alashiban.com/multi-editing-tutorial/