2009-06-26 33 views
83

入れ子になったWPF ToolBarPanel-ToolBar-Menuでは、グリップハンドルを左に、オーバーフロー領域を右に取り除きたいと考えています。どちらもグレー表示されていますが、表示されないようにしています。WPF ToolBar:グリップとオーバーフローを除去する方法

どのように達成するためのアイデアですか?

以下のリンクの図3の画像を見ると、3つのツールバーのうち、最も低いものがドロップダウンの左側とグリッドの右側にあります右端のボタンにオーバーフローがあります。

Image of toolbars

+0

おそらく、コントロールテンプレートを上書きすることによって、それを行うことができます。..私はそれをお勧めしません。 – apandit

+0

Margin = "0,0、-14,0"をツールバーに配置すると、右側を非表示にすることができます。これは私が見つけた最も簡単な解決策ですが、私はToolBarPanelまたはToolBarTrayの内部にない単一のToolBarでテストしました。情報のおかげで –

答えて

128

グリップは、ツールバーの添付プロパティToolBarTray.IsLocked="True"を設定することで削除できます。

Overflow ToggleButtonを削除するには、カスタムのControlTemplateで削除する必要があります。ブレンドしているか、ブレンド3のプレビューをダウンロードするのが難しくない場合は、sixlettervariablesが示唆しています。

ツールバーのロードされたイベントでボタンを非表示にすることもできますが、いずれのルートを使用する場合でも、ツールバーのメニューで添付プロパティーToolBar.OverflowMode="Never"を設定して、アイテムが誤って到達不能エリアにオーバーフローすることはありません。

<ToolBarPanel DockPanel.Dock="Top"> 
    <ToolBar ToolBarTray.IsLocked="True" Loaded="ToolBar_Loaded"> 
     <Menu ToolBar.OverflowMode="Never"> 
      <MenuItem Header="File" /> 
      <MenuItem Header="New" /> 
     </Menu> 
    </ToolBar> 
</ToolBarPanel> 

そして崩壊にオーバーフロートグルを設定します。作業上記

private void ToolBar_Loaded(object sender, RoutedEventArgs e) 
{ 
    ToolBar toolBar = sender as ToolBar; 
    var overflowGrid = toolBar.Template.FindName("OverflowGrid", toolBar) as FrameworkElement; 
    if (overflowGrid != null) 
    { 
     overflowGrid.Visibility = Visibility.Collapsed; 
    } 
    var mainPanelBorder = toolBar.Template.FindName("MainPanelBorder", toolBar) as FrameworkElement; 
    if (mainPanelBorder != null) 
    { 
     mainPanelBorder.Margin = new Thickness(); 
    } 
} 
+10

質問をする:なぜツールバーを使うの?単純なStackPanelをボタンで使用するのはなぜですか?ツールバーはどのようなメリットをもたらしますか? –

+3

Josh Gの回答:通常のパネル(StackPanelなど)の画像を含む透明ボタンを使用すると、白い輪郭が表示されます。同じボタンがツールバーに配置されている場合、白いアウトラインは存在しません。 –

+1

これは、このコンテキストでツールバーのテーマを設定する場合にも便利です(例:マウスオーバーの動作。 –

8

あなたuse Blend to rather simply override the ControlTemplateできToolBarPanel、メニュー、またはツールバーのために。

  1. は右ツールバーのをクリックし、[編集]テンプレートから
  2. を編集テンプレートを選択し、編集し、私は、リソース辞書
  3. [OK]をクリックします

にコピーを追加することをお勧めします

  • コピー]を選択しますToolBarPanelのコントロールテンプレートを編集し、グリップとオーバーフロー信号の表示をCollapsedに設定できます。あなたはすすぎ、他のコントロールのために繰り返すことができます。それは少し時間がかかりますが、ブレンドではそれほど難しくありません。

  • +0

    ありがとうございます。残念ながら、blend2とvs2008はうまく連携してくれていないようですが、他のコードで生成されたコードでは問題が多すぎますので、現在のところvsコードの近くにブレンドされません) – Tom

    +1

    うん、宗教的にVS2k8SP1が来るまで。実際には、私はVS2k8 WASブレンドのWPFエディタを望んでいます。何かを右クリックして、「StackPanel」または「Border」にグループ化することができればもっと良いでしょう。あまりにも悪いMSは、​​それらが異なる経験であることを望んでいます。 – user7116

    +0

    新しいXAML Power Toysは、コントロールをグループ化できる機能を追加したと思います。 (たぶんMoXAML Power Toys ...) – Number8

    0

    方法をオーバーフローを非表示にします。垂直レイアウトの水平レイアウトの

      <Label Height="44" Width="30" Background="{StaticResource CtrlBackground}" Margin="-20,0,0,0"></Label> 
    

    、および

      <Label Height="44" Width="230" Background="{StaticResource CtrlBackground}" Margin="0,-20,0,0" HorizontalAlignment="Left"></Label> 
    

    :私はグリッパーを非表示にするには、以下を使用しました。ツールバー(またはそれを使用する場合はToolbarTray)の後に上記を配置します。

    ボタンに必要な幅と高さを使用します。

    Kaxamlはこのもので遊ぶのに優れています。

    2

    私はWPFを使い始めたばかりで、上記の方法でオーバーフロー矢印(Visual Studio 2010)を隠すことができませんでした。上のToolbar_Loadの例は、矢印に影響を与えたようなものだけでしたが、矢印を空のスペースに変えて矢印のように悪いものにしました。私が考えることができる最も簡単な方法は、ツールバーのマージンを設定することでした。

    <ToolBar Height="26" 
         Name="toolBar" 
         DockPanel.Dock="Top" 
         ToolBarTray.IsLocked="True" 
         ToolBar.OverflowMode="Never"  <!-- no effect --> 
         Margin="0,0,-13,0">     <!-- worked --> 
         <Menu ToolBar.OverflowMode="Never"> <!-- no affect --> 
          <MenuItem Header="_File"></MenuItem> 
         </Menu> 
    </ToolBar> 
    
    +2

    何も私のために働く。 Visual Studio 2015 –

    3

    あなたが負の右マージンを持っているToolBarを設定して、新しいコントロールテンプレートを供給することなく、オーバーフローを「削除」(と、それは丸い左端が、正方形のと奇妙に見えないように、負の左余白に投げることができます右端)。次に、ClipToBounds="True"ToolBarPanelに追加します。これにより、ツールバーの端が切り取られ、パネルの外側に張り付きます。

    <ToolBarPanel Grid.Row="0" ClipToBounds="True"> 
        <ToolBar ToolBarTray.IsLocked="True" Margin="-5,0,-13,0" Padding="5,0,0,0"> 
        . . . 
    
    3

    オーバーフローボタンを完全に隠すのではなく、必要なときにのみ表示する方がよいと思います。これは、そのIsEnabledプロパティにそのVisibilityプロパティを結合することによって行うことができます。

    private static void FixupToolBarOverflowArrow(ToolBar toolBar) 
    { 
        Action fixup =() => 
        { 
         var overflowButton = toolBar.Template.FindName("OverflowButton", toolBar) as ButtonBase; 
         if (overflowButton != null) 
         { 
          overflowButton.SetBinding(
           VisibilityProperty, 
           new Binding("IsEnabled") 
           { 
            RelativeSource = RelativeSource.Self, 
            Converter = new BooleanToVisibilityConverter() 
           }); 
         } 
        }; 
    
        if (toolBar.IsLoaded) 
        { 
         fixup(); 
        } 
        else 
        { 
         RoutedEventHandler handler = null; 
         handler = (sender, e) => 
         { 
          fixup(); 
          toolBar.Loaded -= handler; 
         }; 
    
         toolBar.Loaded += handler; 
        } 
    } 
    

    (同じことは、テンプレートを再定義することにより、XAMLで行うことができます)

    関連する問題