2011-12-07 98 views
4

上下文菜單在不同的.NET Framework中被截斷。查看ZIP文件中的圖像(有兩個截圖,一個來自XP,另一個來自Win7)。上下文菜單在WPF的某些情況下被切斷

我創建了一個簡單的Visual Studio 2010解決方案,它重現了我的問題。 (http://www.mediafire.com/download.php?doq7gsh75qgvzwq)。

在XP似乎工作正常,但無法在Windows 7

這個問題可以在Windows 7上,如果目標的.NET Framework 3.5轉載(包括SP1)(請參閱從壓縮圖像)。

如果我更改目標框架4.0,它工作正常也可以在Windows 7

是一個解決方案,使在.NET Framework 3.5的上下文菜單完全可見Windows 7操作系統?

+0

沒人?請,我需要幫助:) –

+1

好奇的行爲......它真的發生在你說的。對我來說好奇的是,如果在Visual Studio中運行,它發生的最多。當VS沒有運行時,它仍然會發生。對我來說,這是Connect的一個很好的候選人。 – NestorArturo

+0

無法重現。可能是因爲我安裝了.Net 4.5? – Phil

回答

4

看來,當ContextMenu加載ScrollContentPresenter的菜單是不正確的尺寸,裁剪的MenuItem S的ItemPresenter(下面是一個顯示問題的可視化樹的刪節版)。

PopupRoot, Acutal Width: 219,027, Desired Width: 219,027 
    Decorator, Acutal Width: 219,027, Desired Width: 219,027 
     NonLogicalAdornerDecorator, Acutal Width: 219,027, Desired Width: 219,027 
      ContextMenuProxy, Acutal Width: 219,027, Desired Width: 219,027 
       SystemDropShadowChrome, Acutal Width: 214,027, Desired Width: 219,027 
        Border, Acutal Width: 214,027, Desired Width: 214,027 
         Grid, Acutal Width: 212,027, Desired Width: 212,027 
          Rectangle, Acutal Width: 28,000, Desired Width: 32,000 
          Rectangle, Acutal Width: 1,000, Desired Width: 31,000 
          Rectangle, Acutal Width: 1,000, Desired Width: 32,000 
          ScrollViewer, Acutal Width: 210,027, Desired Width: 212,027 
           Grid, Acutal Width: 210,027, Desired Width: 210,027 
            Border, Acutal Width: 210,027, Desired Width: 210,027 
             ScrollContentPresenter, Acutal Width: 210,027, Desired Width: 210,027 
              ItemsPresenter, Acutal Width: 241,047, Desired Width: 245,047 

無效的的ContextMenu的視覺根的度量(在PopupRoot)當菜單被加載應引起的佈局被更新以顯示該ItemsPresenter正確界限。

用於菜單的Load事件處理程序:

private void mainMenu_Loaded(object sender, RoutedEventArgs e) 
{ 
    if (sender != null) 
    { 
     ContextMenu menu = sender as ContextMenu; 
     if (menu != null) 
     { 
      // get the visual root for the context menu 
      var root = (FrameworkElement)GetVisualTreeRoot(menu); 

      // invalidate the menu's layout 
      root.InvalidateMeasure(); 
     }    
    } 
} 

GetVisualTreeRoot方法:

private DependencyObject GetVisualTreeRoot(DependencyObject control) 
{ 
    DependencyObject parent = VisualTreeHelper.GetParent(control); 
    if (parent != null) 
    { 
     return GetVisualTreeRoot(parent); 
    } 
    else 
    { 
     return control; 
    } 
} 
+0

我授予你,因爲這是一個很好的解決方法。如果有效,我會在幾天內嘗試。如果是,答案將被標記爲已接受。感謝您的耐心。 –

+0

它的工作原理,很好的解決方法 –

1

一種解決方法:

<ContextMenu x:Name="mainMenu" Width="300" > 

它似乎停止設置一個固定的寬度時的麻煩。 Connect仍然是一個很好的候選人。

+0

這不是一個解決方案。如果我插入長字,會發生什麼? –

+0

是的,它不是。這是一種解決方法。因爲它似乎是一個不正確的行爲,需要從MS修復,所有你可能得到的是解決方法:o) – NestorArturo

+1

當然,你也可以限制菜單項的大小,以便它們必須包裝文本。 – NestorArturo

0

我能重現此問題在.net 4.5.1也。 無法解決使用上述標記的解決方案。 InvalidateMeasure有時會導致 空的上下文菜單,並且它開始出現。當我窺探上下文菜單時, 發現菜單的ItemsPanel大小計算工作正常,但ScrollContentPresenter大小爲0.任何人都面臨類似的問題。 我的解決方法是:如果

private static void ContextMenuOnLoaded(object sender, RoutedEventArgs routedEventArgs) 
    { 
     var menu = (ContextMenu)sender; 
     if (menu.HasItems) 
     { 
      menu.MinHeight = menu.Items.Count * 25; 
     } 

     menu.Loaded -= ContextMenuOnLoaded; 
    } 

不知道這是最好的解決方案。但爲什麼它會發生也令人驚訝。