如果您想覆盖默认的复制/粘贴行为,您似乎需要使用比 C# 提供的更低级别的东西(请参阅剪贴板事件 C#和检测和区分剪贴板事件(剪切、复制和粘贴))。但是,也许您可以将您的逻辑放在一个“守卫”后面,该“守卫”知道如何指导行动请求(如“复制”),然后将其重定向为适当的。
这是一个示例类:
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
中根据需要设置它的属性。然后,无论您在何处捕获 CTRL+C 快捷方式,只需调用它,它就会处理其余的事情。BeforeLabelEdit
AfterLabelEdit
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();
}
}
}
如您所见,当只有两个状态时,这可能有点矫枉过正(并且状态的数量可能不会增加)。