2011-11-23 80 views
0

我有一個ContextMenu,其中包含一些可以選擇項目(MenuItem)的子菜單。當ContextMenu打開時,我想遞歸地打開當前選擇的項目。所以,我有以下代碼:.NET MenuItem.IsSubmenuOpen = true僅在第一次生效

protected override void OnOpened(RoutedEventArgs e) { 
     base.OnOpened(e); 
     OpenCurrentSubMenu(Items); 
    } 

    private static bool OpenCurrentSubMenu(ItemCollection itemCollection) { 
     foreach (MenuItem item in itemCollection) { 
      if (item.IsChecked) { 
       return true; 
      } 
      else if(OpenCurrentSubMenu(item.Items)) { 
       item.IsSubmenuOpen = true; 
       return true; 
      } 
     } 
     return false; 
    } 

我也有一些其他代碼,以確保只有一個項目被檢查。

這在第一次在子菜單中選擇一個項目時似乎很有效。當我再次打開文本菜單,打開子菜單級聯打開所選項目:

First Drop-down

然而,當我離開上下文菜單,然後重新打開它第二次,所選擇的菜單不開:

Next Drop-down

有誰知道爲什麼和如何解決它?

+0

您的標題顯示「IsItemChecked」,但您的代碼顯示「IsSubmenuOpen」。 –

+0

@ScottRippey - 已更新。謝謝。 – DiamondBack

+0

你能用更多級別的菜單測試嗎?每次重新開放會導致重新開放一個級別還是一直不打開最終菜單? –

回答

3

三件事嘗試:

  • 當上下文菜單打開,遞歸在整個層次結構,並設置IsSubmenuOpen =假,你嘗試打開任何子菜單之前。它可能是先前打開的子菜單被記住,因此您試圖告訴它在同一級別有兩個打開的子菜單。

  • 遞歸找到需要打開的子菜單並將它們存儲在列表中。然後遍歷列表並設置它們,以便在其子子菜單打開之前將最頂層菜單設置爲打開。 (可能是在父母尚未打開時試圖打開孩子並不總是可靠)。

  • 令人討厭的暴力方法:每次打開時刪除並重新創建上下文菜單。這不是很好,但如果你打開一個上下文菜單,你可能會擔心性能影響。它看起來是第一次運作,所以每次都是第一次。

+0

好的提示。我嘗試了幾個變化:我嘗試了Scott Rippey的方法。我也嘗試在關閉時設置IsSubmenuOpen = false,無濟於事。你的第二個子彈很有趣,但並沒有解釋爲什麼第一次級聯工作,但沒有解釋以下時間。蠻力始終是一種選擇:) – DiamondBack

+0

似乎第二個選擇的伎倆,但它仍不能解釋爲什麼第一次級聯工作。 !@ * $#MS .NET – DiamondBack

+1

很可能某些信息在第一次嘗試時未被緩存,因此無論您設置菜單的哪個順序打開,但隨後嘗試菜單系統「知道更多」的關於層次結構或狀態現有的菜單項,並因此而被您嘗試改變事物所困惑。 –

1

在將其設置回true之前,將值設置爲false可能會有幫助。但我無法證實這一點。

item.IsSubmenuOpen = false; 
item.IsSubmenuOpen = true; 
+0

感謝您的提示,斯科特。我以前看過類似的.NET解決方案,看起來很有希望。不幸的是,在這種情況下它不起作用。 – DiamondBack

0

我認爲邏輯應該很好地工作......當菜單項被選中,而不是子菜單項被選中時。 在我看來嘗試兩個循環....一個菜單和另一個子菜單項。