WPFツールバー:グリップとオーバーフローを削除する方法


98

入れ子になったWPF ToolBarPanel-ToolBar-Menuで、左側のグリップハンドルと右側のオーバーフロー領域を削除します。どちらもグレー表示されていますが、表示されないようにしてください。

それを達成する方法に関するアイデアはありますか?

私の用語が完全に正しくない場合に備えて、下のリンクの図3の画像を見ると、3つのツールバーの一番下に、ドロップダウンの左側と右端の右側にグリップがありますボタンオーバーフローがあります。

ツールバーの画像


おそらくコントロールテンプレートを上書きすることでそれを行うことができますが、お勧めしません。
apandit 2009年

ツールバーにMargin = "0,0、-14,0"を配置して、右側をビューの外に出すことができます。これは私が見つけた最も簡単なソリューションですが、ToolBarPanelまたはToolBarTray内ではなく、単一のToolBarでのみテストしました。
ウェインブロス

回答:


153

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

削除するにはオーバーフローのトグルボタンを、あなたはブレンドを持っているか、ブレンド3プレビューが過度に難しいことではありませんダウンロードすることができるかどうかを示唆sixlettervariablesとしてカスタムのControlTemplate、それを削除する必要があります。

ToolBarの読み込まれたイベントでボタンを非表示にすることもできますが、どちらのルートを選択した場合でもToolBar.OverflowMode="Never"、ToolBarのメニューでattachedプロパティを設定して、アイテムが誤って到達できない領域にオーバーフローしないようにする必要があります。

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

そして、Overflow ToggleButtonを折りたたみに設定します。

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();
    }
}

15
質問をする:なぜツールバーを使うのか?ボタンで単純なStackPanelを使用しないのはなぜですか?ToolBarにはどのような利点がありますか?
ジョシュG

5
Josh Gへの回答:通常のパネル(StackPanelなど)の画像で透明なボタンを使用すると、白い輪郭が表示されます。ただし、同じボタンがツールバーに配置されている場合、白い輪郭は表示されません。
Chris Bennet、2010

2
これは、マウスオーバー動作など、このコンテキストでツールバーのテーマを設定する場合にも役立ちます。
グレッグD

36
参考:シンプルなStackPanelを使用しても、ツールバーのスタイルを取得できます。<Button Style = "{StaticResource {x:Static ToolBar.ButtonStyleKey}}"> <Image Source = "{StaticResource ZoomIn}"> </ Image> </ Button>
11

1
さらに、ツールバー内で<Menu>コントロールを使用しない場合は、ToolBar.OverflowMode = "Never"プロパティをツールバー内の<Button>コントロール内に直接設定できることもわかりました。これは私が探していた効果を生み出しました
フォード

8

あなたはできるというだけでのControlTemplateをオーバーライドするためにブレンドを使用 ToolBarPanel、メニュー、またはツールバーのために。

  1. ツールバーを右クリックして[テンプレートの編集]を選択します
  2. 「テンプレートの編集」から、「コピーの編集」を選択します
  3. コピーをリソースディクショナリに追加することをお勧めします
  4. OKをクリック

これで、ToolBarPanelのコントロールテンプレートを編集し、グリップとオーバーフロー信号の可視性をCollapsedに設定できます。他のコントロールをすすぎ、繰り返すことができます。少し時間がかかりますが、Blendを使用してもそれほど難しくありません。


情報をありがとう。残念ながら、blend2とvs2008はうまく機能していないようです。一方が他方で生成されたコードを処理するときに問題が多すぎるため、現在、blendをvsコードの近くに配置することはできません;)
Tom

1
そうですね、VS2k8SP1が登場するまでは、かなり慎重にBlendを使用していました。実際、私はVS2k8 WAS BlendのWPFエディターを望んでいます。何かを右クリックして、Group Intoを「StackPanel」または「Border」と言うことができるようにすると、さらに便利になります。あまりにも悪いMSは、​​彼らが異なる経験であることを望んでいます。
user7116 2009年

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

8

ToolBar負の右マージンを持つようにを設定することで、新しいコントロールテンプレートを提供せずにオーバーフローを「削除」できます(負の左マージンを投入して、丸みのある左端ではなく四角い右端で奇妙に見えるようにします)。次に、をパネルの領域の外側に貼り付けられているツールバーの端を切り取るに追加ClipToBounds="True"ToolBarPanelます。

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

5

オーバーフローボタンを完全に非表示にするのではなく、必要な場合にのみ表示することをお勧めします。これは、そのVisibilityプロパティをそのIsEnabledプロパティにバインドすることで実行できます。

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でも同じことができます)


3

私は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>

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>

垂直レイアウトの場合。上記をToolbar(またはそれを使用している場合はToolbarTray)の後に配置します。

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

Kaxamlは、この機能で遊ぶのに最適です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.