2011-12-07 13 views
4

異なる.NET Frameworkでコンテキストメニューが切り捨てられます。 ZIPファイル内の画像を見る(2つのスクリーンショット、XPからのスクリーンショット、Win7からのスクリーンショット)。WPFの状況によってはコンテキストメニューが切り詰められる

問題を再現するシンプルなVisual Studio 2010ソリューションを作成しました。

http://www.mediafire.com/download.php?doq7gsh75qgvzwq)。

はXP上で、それが正常に動作するようですが、ターゲットの.NET Frameworkが3.5である場合は、Windows 7

上の問題は、Windows 7上で再生することができません(SP1含む)(ZIPからの画像を参照してください)。

私は4.0にターゲットフレームワークを変更した場合、それは

のWindows 7上でも正常に動作はWindows 7のOS上での.NET Framework 3.5で目に見える完全なコンテキストメニューを作成するためのソリューションですか?

+0

誰もいませんか?してください、私は助けが必要です:) –

+1

好奇心の行動...あなたが言うようにそれは本当に起こります。私にとって不思議なことに、Visual Studio内で実行している場合は、これが最も起こります。まだVSが動作していないときに起こることがあります。私にとってこれはConnectの候補です。 – NestorArturo

+0

再現できません。 NET 4.5がインストールされている可能性がありますか? – Phil

答えて

4

それはContextMenuがロードされたときに、メニューのためScrollContentPresenterMenuItem秒の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

私もネット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; 
    } 

わからない場合。しかし、なぜそれが起こるのも驚くべきことです。

関連する問題