WPF ToolBar: Entfernen von Griff und Überlauf

97

In einem verschachtelten WPF ToolBarPanel-ToolBar-Menü möchten wir den Griff links und den Überlaufbereich rechts entfernen. Sie sind beide ausgegraut, aber wir möchten, dass sie überhaupt nicht angezeigt werden.

Irgendwelche Ideen, wie man das erreicht?

Nur für den Fall, dass meine Begriffe nicht ganz korrekt sind. Wenn Sie sich das Bild in Abbildung 3 des folgenden Links ansehen, befindet sich auf der untersten der drei Symbolleisten der Griff links vom Dropdown und rechts vom rechten Rand Knopf gibt es den Überlauf.

Bild von Symbolleisten

Tom
quelle
Sie könnten es wahrscheinlich tun, indem Sie die Kontrollvorlage überschreiben ... aber ich würde es nicht empfehlen.
Apandit
Sie können Margin = "0,0, -14,0" in die Symbolleiste einfügen, um die rechte Seite aus dem Blickfeld zu verschieben. Dies ist die einfachste Lösung, die ich gefunden habe, aber ich habe nur mit einer einzelnen ToolBar getestet, nicht in einem ToolBarPanel oder einem ToolBarTray.
Wayne Bloss

Antworten:

152

Der Griff kann durch Festlegen der angehängten Eigenschaft ToolBarTray.IsLocked="True"in der Symbolleiste entfernt werden.

Um den Overflow ToggleButton zu entfernen, müssen Sie ihn in einer benutzerdefinierten ControlTemplate entfernen, wie es die Sixletter-Variablen vorschlagen. Wenn Sie die Blend 3-Vorschau haben oder herunterladen können, ist dies nicht allzu schwierig.

Sie können die Schaltfläche auch einfach im geladenen Ereignis der ToolBar ausblenden. Unabhängig von der Route sollten Sie jedoch auch die angehängte Eigenschaft ToolBar.OverflowMode="Never"im Menü der ToolBar festlegen, damit Elemente nicht versehentlich in einen nicht erreichbaren Bereich überlaufen.

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

Und setzen Sie den Overflow ToggleButton auf reduziert:

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();
    }
}
rmoore
quelle
15
Wirft die Frage auf: Warum überhaupt eine ToolBar verwenden? Warum nicht einfach ein einfaches StackPanel mit Schaltflächen verwenden? Welchen Nutzen bietet die ToolBar?
Josh G
5
Antwort auf Josh G: Wenn Sie eine transparente Schaltfläche mit einem Bild auf einem normalen Bedienfeld (StackPanel usw.) verwenden, wird ein weißer Umriss angezeigt. Wenn dieselbe Schaltfläche in einer Symbolleiste platziert wird, ist der weiße Umriss nicht vorhanden.
Chris Bennet
2
Dies ist auch nützlich, wenn Sie in diesem Zusammenhang das Thema einer Symbolleiste verwenden möchten, z. B. das Mouseover-Verhalten.
Greg D
36
Zu Ihrer Information: Sie können ein einfaches StackPanel verwenden und trotzdem das Styling der Symbolleiste erhalten. <Button Style = "{StaticResource {x: Static ToolBar.ButtonStyleKey}}"> <Image Source = "{StaticResource ZoomIn}"> </ Image> </ Button>
thrag
1
Außerdem habe ich festgestellt, dass, wenn Sie das Steuerelement <Menü> nicht in Ihrer Symbolleiste verwenden möchten, die Eigenschaft ToolBar.OverflowMode = "Never" direkt in Ihrem Steuerelement <Button> in Ihrer Symbolleiste festgelegt werden kann. Dies erzeugte den Effekt, den ich suchte
Ford
8

Sie können Blend verwenden, um die ControlTemplate für das ToolBarPanel, das Menü oder die ToolBar einfach zu überschreiben .

  1. Klicken Sie mit der rechten Maustaste auf die Symbolleiste und wählen Sie Vorlage bearbeiten
  2. Wählen Sie unter Vorlage bearbeiten die Option Kopie bearbeiten aus
  3. Ich empfehle, die Kopie einem Ressourcenwörterbuch hinzuzufügen
  4. OK klicken

Sie bearbeiten jetzt die Steuerungsvorlage für das ToolBarPanel und können die Sichtbarkeit für das Griff- und Überlaufsignal auf Reduziert einstellen. Sie können für die anderen Steuerelemente spülen und wiederholen. Es ist ein bisschen zeitaufwändig, aber mit Blend ist es nicht besonders schwer.

user7116
quelle
Danke für die Information. Leider scheinen Blend2 und vs2008 für uns nicht gut zusammenzuarbeiten, zu viele Probleme, wenn eines mit Code arbeitet, der im anderen generiert wurde. Daher lassen wir Blend derzeit nicht in die Nähe unseres vs-Codes kommen;)
Tom
1
Ja, wir haben Blend ziemlich religiös verwendet, bis VS2k8SP1 auftauchte. Eigentlich wünsche ich mir, dass der WPF-Editor in VS2k8 WAS Blend ist. Viel schöner, wenn Sie mit der rechten Maustaste auf etwas klicken und "Gruppe in" StackPanel "oder" Grenze "sagen können. Schade, dass MS möchte, dass sie unterschiedliche Erfahrungen machen.
user7116
Ich denke, die neuen XAML Power Toys bieten eine Funktion, mit der Sie Steuerelemente gruppieren können. (Vielleicht ist es das MoXAML Power Toys ...)
Nummer 8
8

Sie können den Überlauf "entfernen", ohne eine neue Steuerungsvorlage anzugeben, indem Sie festlegen ToolBar, dass negative rechte Ränder vorhanden sind (und einen negativen linken Rand einwerfen, damit er mit abgerundeten linken Kanten, aber quadratischen rechten Kanten nicht seltsam aussieht). Fügen Sie dann hinzu ClipToBounds="True", ToolBarPanelwelche die Kanten der Symbolleiste abschneiden, die jetzt außerhalb des Bedienfeldbereichs haften.

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

Anstatt den Überlaufknopf vollständig auszublenden, ist es meiner Meinung nach besser, ihn nur bei Bedarf anzuzeigen. Dies kann erreicht werden, indem sein VisibilityEigentum an sein IsEnabledEigentum gebunden wird :

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

(Dasselbe kann in XAML durch Neudefinition der Vorlage erfolgen.)

Thomas Levesque
quelle
3

Ich fange gerade mit WPF an und konnte keine der oben genannten Methoden zum Ausblenden meines Überlaufpfeils (Visual Studio 2010) finden. Das einzige, was den Pfeil zu beeinflussen schien, war das obige Beispiel Toolbar_Load, aber alles, was dazu führte, war, den Pfeil in zu verwandeln ein leerer Raum, der so schlecht aussah wie der Pfeil. Der einfachste Weg, den ich mir vorstellen konnte, bestand darin, die Ränder der Symbolleiste festzulegen.

<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>
Belmiris
quelle
0

Die oben beschriebenen Methoden verbergen den Überlauf. Ich habe Folgendes verwendet, um den Greifer zu verstecken:

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

für ein horizontales Layout und

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

für ein vertikales Layout. Platzieren Sie das Obige hinter der Symbolleiste (oder ToolbarTray, falls verwendet)

Verwenden Sie die für Ihre Schaltflächen erforderliche Breite und Höhe.

Kaxaml eignet sich hervorragend zum Spielen mit diesem Zeug.

Frediano
quelle