2017-01-20 4 views
2

ContextMenuを使用してボタンを有効/無効にする方法を探しています。しかし、私の問題は、MenuItemを有効にしてボタンを無効にすると、ContextMenuが表示されなくなります。ボタンなどの無効なコントロールのContextMenu

無効なコントロールでContextMenuやその他の動作を維持する方法はありますか?

ContextMenu cm = new ContextMenu(); 
cm.MenuItems.Add("Enable", new EventHandler(enableButton)); 

this.button1.ContextMenu = cm; 



private void enableButton(object sender, EventArgs e) 
{ 
    MenuItem menuItem = sender as MenuItem; 
    if (menuItem != null) 
    { 
     ContextMenu menu = menuItem.GetContextMenu(); 
     Control sourceControl = menu.SourceControl; 
     sourceControl.Enabled = !sourceControl.Enabled; 
    } 
} 
+2

機能を無効にしたり、ボタンをグレー表示にしたり、これらのイベントをインターセプトすると、ボタンは無効になっているように見えますが、ContextMenuイベントを受信できるようになります。この動作は "By-Design"です –

+0

可能だったとしても、無効化コントロールを右クリックしようとする人はいないので、悪い設計になります。それが多少意味をなさないかもしれない唯一のケースはUIデザイナーでしょう。 – Phil1970

答えて

1

フォームのマウスアップイベントを右クリックしてコンテキストメニューを表示するための回避策があります。 this.GetChildAtPoint(e.Location)を使用すると、右クリックしたコントロールを見つけることができます。

private void Form1_MouseUp(object sender, MouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Right 
      && this.GetChildAtPoint(e.Location)?.Name == "enableButton") 
    { 
     ContextMenu.Show(); 
    } 
} 
+0

これは、フォームをクリックしたときにクリックしたコントロールを指定していない場合ですか?したがって、複数のContextMenuがある場合、これは動作しません。 –

+1

'GetChildAtPoint'を使ってコントロールを見つけることができます。私はそれがきれいな解決策ではないことに同意します – esiprogrammer

2

EnabledプロパティでMSDN

から、実行 時にコントロールを有効または無効にすることができます。たとえば、アプリケーションの現在の状態である に適用されないコントロールを無効にすることができます。また、コントロールを無効にして、 の使用を制限することもできます。たとえば、 ユーザーがクリックしないようにするには、ボタンを無効にすることができます。コントロールが無効になっている場合は、 を選択することはできません。

とコンテナコントロールは、その有効なプロパティがfalseに設定されている

、すべて その含まれているコントロールは、同様に、無効になっています。たとえば、ユーザー が無効なGroupBox コントロールに含まれるコントロールをクリックすると、イベントは発生しません。

したがって、無効にしたコントロールはイベントを発生させることはできません。

ボタンをゲイドにしてクリックイベントを無効にし、リバースイネーブルメソッドを無効にする独自のディスエーブルメソッドを作成できます。あなたはこのような何かを行うことができ@esiprogrammer暗示に基づいて

private void Form1_MouseUp(object sender, MouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Right) 
    { 
     Point pt = e.Location; 

     Control ctrl = this.GetChildAtPoint(pt); 

     if (ctrl != null) 
     { 
      ContextMenu menu = ctrl.ContextMenu;    

      menu.Show(ctrl, new Point(10,10)); 
     }      
    } 
} 
2

独自の無効化機能を作るには、グレーアウトするためのボタンを設定し、そのイベントを横取り、この方法は、ボタンは無効表示されますが有効になっていますContextMenuイベントを受け取ります。この動作は「By-Design」です。

btn.Fontを簡単に修正して無効にすることができます。イベントの1つは、無効にしてからそれらの登録を解除し、有効にする方法です。

dynamic controltype = btn; 
var events = Type.ReflectionOnlyGetType(controltype.AssemblyQualifiedName, false, true).GetEvents(); 
foreach (var item in events) 
{ 
    //EventHandler<T> use a generic Event Handler to Subscribe and Unsubscribe 
} 
+0

こんにちは、私はこの 'dynamic controltype = new Button();'を実行しようとし、次の行でエラーを受け取りました:追加情報: 'System.Windows.Forms.Button' 'AssemblyQualifiedName'の定義 –

関連する問題