2012-01-03 19 views
1

私はそれをタップするとその状態を変えるようなリストボックス項目にコンテキストメニュー項目を接続しました。アイテムが選択された後に開いたままにするには、メニューを開くか、終了した直後にメニューをプログラムで再開する必要があります。アイテムが選択された後、WP7コンテキストメニューが閉じないようにするにはどうすればよいですか?

私のメニューはそうのようになります。

Some Command 1 
Some Command 2 
Some Command 3 
Inverted 

、ユーザーがInvertedコマンドをタップしてからのように見えるのデータバインディングを介してそれらが反転モードで機能させるために、他のいずれかのコマンド、およびメニューをタップすることができますそう:

Some Command 1 
Some Command 2 
Some Command 3 
Inverted ✔ 

は、タップした後に開いたメニューを維持する方法を理解することができるという、私はそうのような少ない理想的な再オープンしたメニューのアプローチを試みたない:

private void onCommandInvert(object sender, RoutedEventArgs e) 
{ 
    CommandState.Instance.Inverted = !CommandState.Instance.Inverted; 

    // Open it again. 
    MenuItem menuItem = (MenuItem)sender; 
    ContextMenu menu = (ContextMenu)menuItem.Parent; 
    menu.IsOpen = true; 
} 

しかし、そうすることがmenu.IsOpen = true声明で次の例外がスローされます:

A first chance exception of type 'System.InvalidOperationException' occurred in 
    System.Windows.dll 

An unhandled exception of type 'System.InvalidOperationException' occurred in 
    System.Windows.dll 

Additional information: Element is already the child of another element. 

私も同じ例外が発生して、Closedイベントに次のことを試してみました:

private void onContextMenuClosed(object sender, RoutedEventArgs e) 
{ 
    ContextMenu menu = (ContextMenu)sender; 
    menu.IsOpen = true; 
} 

任意のアイデア?ありがとう!

+0

ユーザーは最初にメニューを表示してから、その後に無限にオンとオフを切り替えることができますか?奇妙に思える。 –

+1

また、Silverlight Toolkitのソースを見ると、コンテキストメニューの仕組みがわかります。1.ページの「スクリーンショット」を撮ります。 2.ページの縮尺を変更します。* .9 3.コンテキストメニューが表示されます。 4.コンテキストメニュー自体を追加します。オッズは実際にページが「スクリーンショット」になるので、これはあなたが探している通りに正確にはできません。 tl; dr:あなたのUIはもはやコンテキストメニューを使用しないように考え直すことができるようです。 –

答えて

0

私はそれを手に入れました! willmelさんのコメントのおかげで、私はMenuItemのソースコードを掘り下げ、OnClick()をオーバーライドして、私が必要としていたもの(間違いない理想的な解決策)を実現できました。しかし、私はClickにアクセスできませんでしたので、私はStayClickイベントプロパティも導入する必要がありました。

お楽しみください!

using Microsoft.Phone.Controls; 
using System.Windows; 

namespace MyNamespace 
{ 
    public class MenuItemEx : MenuItem 
    { 
    public bool StayOpenWhenClicked 
    { 
     get; 
     set; 
    } 

    public event RoutedEventHandler StayClick; 

    protected override void OnClick() 
    { 
     if (StayOpenWhenClicked) 
     { 
     if (StayClick != null) 
     { 
      StayClick.Invoke(this, new RoutedEventArgs()); 
     } 
     } 
     else 
     { 
     base.OnClick(); 
     } 
    } 
    } 
} 

とページのXAMLで、ユーザーがアイテムを選択した後にメニューを持続したい場合は、my:MenuItemEx

<my:MenuItemEx 
    Header="Inverted"    
    StayClick="onCommandInvert" 
    StayOpenWhenClicked="True" 
/> 
+0

これが必要な場合は、設計に欠陥があると思われます。ユーザーはこれを期待しません。彼はメニューをどうやって閉じますか?開いたままにする場合は、コンテキストメニューではありません。 –

+0

ユーザーは、Inverted以外の別のメニュー項目を選択するか、通常のようにBack hwボタンを押すことによってメニューを閉じることができます。代わりの設計は、反転されたケースの各メニュー項目を複製し、「いくつかのコマンド1反転」、「一部のコマンド2反転」、「いくつかのコマンド3反転」などであり、これはより欠陥のある設計である。私は長いことこのことについて頭を叩き、何も考えられませんでした。より良い解決策があれば教えてください。 :) – swinefeaster

+0

あなたが記述している状況は、設定ページやトグルボタン(リストボックスの近く)とよく似ています。 –

0

を使用する代わりにtoolkit:MenuItemの後、私は、コンテキストメニューコントロールがものではないと考えていますあなたは使うべきです。

より良いこれらは上制定するオプションがあります場合は、代わりに動作を模倣し、それが(側にまたは上記/下記)理にかなって画面上に適切に配置持って

を独自のユーザーコントロールを作成する必要があります選択された項目は、アプリケーションバーのアイコン/メニュー項目の使用を検討し、リストボックス項目の現在選択されている値を読み取るイベントコードを記述します。

これが役に立ちます。

関連する問題