2012-09-12 4 views
5

現在、編集メインメニューのキーボードショートカットとしてCtrl + CとCtrl + Vを使用したC#winformsアプリケーションがあります。これらのメニュー項目に応答するカスタムのコピー/ペーストの動作がコード内にあります(リストビューの行のコピーや貼り付けなど)。テキストエディットのコピー/ペーストを許可しながら、C#winformsによるカスタムコピー/貼り付けの動作

しかし、私の問題は、行の中のテキストを編集できることです。そうした場合、Ctrl + CとCtrl + Vを押して編集メニューコマンドを起動し、通常のテキストベースのコピー/ペースト。

BeforeLabelEditイベントとAfterLabelEditイベントがトリガされ、そこからメニュー項目を手動で無効/再有効化することを試みました。残念ながら、無効化されたメニュー項目のキーボードショートカットはまだ有効になっている/無効にする必要のあるメニュー項目を決定するために使用されているmenu_Popupイベントをトリガーしているようです。 (たとえば、「貼り付け」は、クリップボードにテキストがある場合のみ有効です)。したがって、メニュー項目を無効にしても、キーボードショートカットはポップアップイベントをアクティブにします。これにより、メニュー項目が再び有効になります。 (これはバグですか?)

メニュー項目のキーボードショートカットを一時的に無効にする方法はありません。手動で古いショートカットを保存し、ショートカットをnullに設定してから再度有効にする必要があるときにコピーし直す必要はありません(汚いと感じる)。

コピー/ペーストの動作を上書きしたり、追加したりするのはよくあることです。ここで使用するより良いパターンがありますか?

+0

ovveridingコピー貼り付けは私に悪い考えとして鳴ります。私はいつもすべてのアプリで同じように動作する 'コピー/貼り付け 'に慣れています。あなたのアプリはちょうど私を混乱させるでしょう。 しかし、もしあなたが主張しているのであれば、焦点を確認してみてはいかがですか?フォーカスがあなたのテキストボックスにある場合コピーを1つコピーする他のコピーをしない場合 – Nahum

+0

カスタムコピー/ペーストの動作は、テキストを編集していないときに行をコピーして貼り付けることを扱います。テキストを編集しているときに、デフォルトのコピー/ペーストの動作が必要です。 –

+2

メニューのショートカットキーをクリアするのが最も簡単です。他の選択肢は「汚れ」ます。 –

答えて

0

デフォルトのコピー/ペーストの動作をオーバーライドする場合は、C#よりも低いレベルを使用する必要があります(Clipboard event C#およびDetect & Differentiate Clipboard Events (Cut,Copy and Paste)を参照)。しかし、アクションのリクエスト(「コピー」など)を指示し、それをアプロプロとしてリダイレクトする方法を知っている「ガード」の背後にロジックを置くこともできます。ここで

は、サンプルクラスです:

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)*/ } 
    } 
} 

あなたはそれがBeforeLabelEditAfterLabelEditイベントで適切なguardedCommand.CurrentlyEditingプロパティの設定、その後、クラスを作成し使用するには。次に、CTRL + Cのショートカットをキャッチすると、guardedCommand.DoCopy()が呼び出され、残りの部分が処理されます。

あなたが探しているパターンについて読んでいる場合は、State Patternをチェックしてください。実際の州(または戦略)パターンであるためには、if/elseまたはswitchを使うのではなく、DoCopy()DoPaste()を実装する個別の具体的なクラスが必要です。次に、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(); 
     } 
    } 
} 

が、これは少しやり過ぎかもしれあり2つの状態に過ぎません(州の数はおそらく増加しません)。

+0

これは、デフォルトのコピー/ペーストの動作を自分でコーディングする必要があることを意味しますか?これは私が避けたいと思っていたものです。 また、これは右のショートカットキーの列のメニューにコマンドを表示できないことを意味しますか? 私には驚きましたが、デフォルトでは、KeyDownメソッドはラベルを編集しているときCtrl + Cをキャプチャしませんが、編集していないときには便利です。これは、メニューのショートカットキーとは異なる動作です。メニューのショートカットキーは、割り当てられているときに編集中かどうかにかかわらずトリガーされます。 –

+0

申し訳ありませんが、何らかの理由で、既定のコピー/貼り付けを使用するコードが既に実装されているという印象を受けました。あなたの質問を読んだ後、私はあなたがそれを言及していないことを知っています。私は "最高"の解決策が国家(または[戦略](http://en.wikipedia.org/wiki/Strategy_pattern))の実装になると思う。@ジョンのようなあなたのためのショートカットを設定しクリアするパターンあなたが使っている国/あなたが使いたい戦略に応じて、言います。 –

関連する問題