2012-09-12 74 views
5

我目前有一个C#winforms应用程序,在编辑主菜单上将Ctrl + C和Ctrl + V绑定为键盘快捷键。在代码中有一些自定义复制/粘贴行为,它们响应这些菜单项,例如复制和粘贴列表视图中的行。使用C#winforms自定义复制/粘贴行为,同时允许文本编辑复制/粘贴

但是,我的问题是,你可以编辑一行内的文本,当你这样做时,我想Ctrl + C和Ctrl + V不触发编辑菜单命令,而应该默认为基于正常文本的副本/糊。

我尝试过的一件事是触发BeforeLabelEdit和AfterLabelEdit事件,并手动禁用/重新启用里面的菜单项。不幸的是,似乎禁用菜单项上的键盘快捷键仍然会触发menu_opopup事件,该事件当前用于决定应启用/禁用哪些菜单项。 (例如,“粘贴”仅在剪贴板上有文本时才有效)。所以,即使我禁用菜单项,键盘快捷键仍然会激活弹出事件,这将重新启用菜单项。 (这是一个错误吗?)

我找不到任何方法暂时禁用菜单项键盘快捷方式,而无需手动存储旧的快捷方式,将快捷方式设置为null,然后在需要重新启用时将其复制回来(感觉脏)。

当然,覆盖复制/粘贴行为或添加它是一件常见的事情要做?这里有更好的模式吗?

+0

ovveriding复制粘贴声音对我来说是一个坏主意。我习惯于“复制/粘贴”它始终在所有应用程序上都一样。你的应用只会让我困惑。 但如果你坚持,为什么不检查重点?如果焦点位于文本框上,请执行一个副本粘贴,如果不是,请执行另一个操作。 – Nahum

+0

我们的自定义复制/粘贴行为仅处理在未编辑文本时复制和粘贴行。编辑文本时,我想要默认的复制/粘贴行为。 –

+2

清除菜单的快捷键是最简单的方法。其他替代品将是'更脏'。 –

回答

0

如果您想覆盖默认的复制/粘贴行为(请参阅Clipboard event C#Detect & Differentiate Clipboard Events (Cut,Copy and Paste)),您似乎需要使用比C#优惠级别更低的级别。然而,也许你可以把自己的逻辑放在一个知道如何引导行动请求(如“复制”)的“警卫”之后,然后将其重定向为approprite。

下面是一个简单类:

namespace Your.App 
{ 
    public class GuardedCommand 
    { 
     public bool CurrentlyEditing { get; set; } 
     public GuardedCommand() 
     { 
      CurrentlyEditing = false; 
     } 
     public void DoCopy() 
     { 
      if(CurrentlyEditing) 
       StandardCopyCommand(); 
      else 
       ShortcutCopyCommand(); 
     } 
     void ShortcutCopyCommand() { /*menu work here (or delegate to another class)*/ } 
     void StandardCopyCommand() { /*"normal" work here (or delegate again)*/ } 
    } 
} 

要使用你会创建类,然后将它guardedCommand.CurrentlyEditing财产作为BeforeLabelEditAfterLabelEdit事件为宜。然后,无论您是否抓住CTRL + C快捷键,只需调用guardedCommand.DoCopy()即可完成其余操作。

如果您正在寻找关于您想要做什么的模式,请查看State Pattern,该代码是上述代码的一种实现。要成为一个真正的国家(或战略)模式,它需要具有实现DoCopy()DoPaste()的独立具体类,而不仅仅是使用if/else或switch。然后,当CurrentlyEditing正在改变时,适当的具体实现将被设置为用于处理DoCopy()方法的当前类。

而且只是因为我花了更长的时间来写这一段比它本来只给你一些代码,这里的一些代码:

namespace Your.App 
{ 
//correct implementation of the State Pattern 
    interface IClipboard 
    { 
     void Copy(); 
     void Paste(); 
    } 
    class MyCustomClipboard : IClipboard 
    { 
     public void Copy() { /*your special code*/ } 
     public void Paste() { /*your code again*/ } 
    } 
    class DefaultClipboard : IClipboard 
    { 
     public void Copy() { /*default code*/ } 
     public void Paste() { /*default code again*/ } 
    } 
    public class StateClass 
    { 
     IClipboard State { get; set; } 
     public StateClass() 
     { 
      CurrentlyEditing = false; 
     } 
     bool _currentlyEditing; 
     public bool CurrentlyEditing 
     { 
      get { return _currentlyEditing; } 
      set 
      { 
       _currentlyEditing = value; 
       if(_currentlyEditing) 
        State = new DefaultClipboard(); 
       else 
        State = new MyCustomClipboard(); 
      } 
     } 
     public void Copy() 
     { 
      State.Copy(); 
     } 
     public void Paste() 
     { 
      State.Paste(); 
     } 
    } 
} 

正如你所看到的,这可能是一个有点矫枉过正时,有只有两个州(并且州的数量可能不会增加)。

+0

这是否意味着我需要自己编写默认的复制/粘贴行为?这是我希望避免的。 此外,这是否意味着我无法在右侧的快捷键列中的菜单中列出命令? 令我感到意外的是,默认情况下,当我编辑标签时,KeyDown方法不会捕获Ctrl + C,但是当我不编辑它时(这很有用)。这是与菜单快捷键不同的行为,分配时会触发我是否正在编辑。 –

+0

对不起,出于某种原因我的印象是你有代码使用已经实现的默认复制/粘贴。重新阅读你的问题后,我发现你从来没有提到过。我怀疑“最好”的解决方案是实施国家(或[战略](http://en.wikipedia.org/wiki/Strategy_pattern))模式,它负责为你设置和清除快捷键,如@John提到,取决于你在什么状态/你想用什么策略。 –