Pasek narzędzi WPF: jak usunąć uchwyt i przepełnienie

98

W zagnieżdżonym menu WPF ToolBarPanel-ToolBar chcemy pozbyć się uchwytu po lewej stronie i obszaru przepełnienia po prawej. oba są wyszarzone, ale chcielibyśmy, aby w ogóle nie były wyświetlane.

jakieś pomysły, jak to osiągnąć?

na wypadek, gdyby moje terminy nie były całkowicie poprawne, jeśli spojrzysz na obraz na rysunku 3 z linku poniżej, na najniższym z trzech pasków narzędzi znajduje się uchwyt po lewej stronie listy rozwijanej i po prawej stronie najbardziej po prawej przycisk jest przepełnienie.

Obraz pasków narzędzi

Tomek
źródło
Prawdopodobnie mógłbyś to zrobić, nadpisując szablon kontrolny ... ale nie polecałbym tego.
apandit
Możesz umieścić Margin = "0,0, -14,0" na pasku narzędzi, aby wypchnąć prawą stronę z widoku. Jest to najłatwiejsze rozwiązanie, jakie znalazłem, ale testowałem tylko z pojedynczym paskiem narzędzi, a nie wewnątrz ToolBarPanel lub ToolBarTray.
Wayne Bloss

Odpowiedzi:

153

Uchwyt można usunąć, ustawiając dołączoną właściwość ToolBarTray.IsLocked="True"na pasku narzędzi.

Aby usunąć Overflow ToggleButton , będziesz musiał usunąć go w niestandardowym ControlTemplate, zgodnie z sugestią sixlettervariables, co nie jest zbyt trudne, jeśli masz mieszankę lub możesz pobrać podgląd Blend 3 Preview.

Możesz także po prostu ukryć przycisk w załadowanym zdarzeniu ToolBar, chociaż niezależnie od wybranej trasy, powinieneś również ustawić dołączoną właściwość ToolBar.OverflowMode="Never"w menu ToolBar, aby elementy nie mogły przypadkowo przepełnić się do niedostępnego obszaru.

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

I ustaw Overflow ToggleButton na zwinięty:

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
źródło
15
Zaczyna się pytanie: po co w ogóle używać ToolBara? Dlaczego nie użyć prostego panelu StackPanel z przyciskami? Jakie korzyści zapewnia ToolBar?
Josh G
5
W odpowiedzi na Josh G: Jeśli użyjesz przezroczystego przycisku z obrazem na normalnym panelu (StackPanel itp.), Będzie on miał biały kontur. Jednak gdy ten sam przycisk jest umieszczony na pasku narzędzi, biały kontur nie jest obecny.
Chris Bennet,
2
Jest to również przydatne, jeśli chcesz utworzyć motyw paska narzędzi w tym kontekście, np. Zachowanie wskaźnika myszy.
Greg D
36
FYI: Możesz użyć prostego StackPanel i nadal uzyskać styl paska narzędzi. <Button Style = "{StaticResource {x: Static ToolBar.ButtonStyleKey}}"> <Image Source = "{StaticResource ZoomIn}"> </Image> </Button>
przekaz
1
Dodatkowo odkryłem, że jeśli nie chcesz używać kontrolki <Menu> na pasku narzędzi, właściwość ToolBar.OverflowMode = "Nigdy" można ustawić bezpośrednio w kontrolce <Button> na pasku narzędzi. Stworzyło to efekt, którego szukałem
ford
8

Możesz użyć Blend, aby po prostu zastąpić ControlTemplate dla ToolBarPanel, Menu lub ToolBar.

  1. Kliknij prawym przyciskiem myszy pasek narzędzi i wybierz opcję Edytuj szablon
  2. W Edytuj szablon wybierz Edytuj kopię
  3. Zalecam dodanie kopii do słownika zasobów
  4. Kliknij OK

Będziesz teraz edytować szablon kontrolny dla ToolBarPanel i możesz ustawić widoczność na Zwinięty dla sygnału uchwytu i przepełnienia. Możesz przepłukać i powtórzyć dla innych kontrolek. Jest to trochę czasochłonne, ale nie jest strasznie trudne z Blendem.

user7116
źródło
dzięki za informację. niestety blend2 i vs2008 nie wydają się dobrze ze sobą współpracować, zbyt wiele problemów, gdy jeden działa z kodem wygenerowanym w drugim, więc obecnie nie pozwalamy, aby blend zbliżył się do naszego vs code;)
Tom
1
Tak, używaliśmy Blend dość religijnie, dopóki nie pojawił się VS2k8SP1. Właściwie chciałbym, żeby edytor WPF w VS2k8 WAS Blend. O wiele przyjemniej jest móc kliknąć coś prawym przyciskiem myszy i powiedzieć „Grupuj w„ StackPanel ”lub„ Border ”. Szkoda, że ​​SM chce, aby były to różne doświadczenia.
user7116
Myślę, że nowe XAML Power Toys dodają funkcję, która pozwala grupować kontrolki. (Może to MoXAML Power Toys ...)
Number8
8

Możesz „usunąć” przepełnienie bez dostarczania nowego szablonu kontrolnego, ustawiając ToolBarujemne prawe marginesy (i dodając ujemny lewy margines, aby nie wyglądał dziwnie z zaokrąglonymi lewymi krawędziami, ale kwadratowymi prawymi krawędziami). Następnie dodaj ClipToBounds="True"do tego, ToolBarPanelktóry odetnie krawędzie paska narzędzi, które teraz wystają poza obszar panelu.

<ToolBarPanel Grid.Row="0" ClipToBounds="True">
    <ToolBar ToolBarTray.IsLocked="True" Margin="-5,0,-13,0" Padding="5,0,0,0">
    . . .
John Fisher
źródło
5

Zamiast całkowicie ukrywać przycisk przepełnienia, myślę, że lepiej jest go wyświetlać tylko wtedy, gdy jest to konieczne. Można to zrobić, wiążąc jego Visibilitywłaściwość z jego IsEnabledwłaściwością:

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

(to samo można zrobić w XAML, ponownie definiując szablon)

Thomas Levesque
źródło
3

Właśnie zaczynam od WPF i nie mogłem uzyskać żadnej z powyższych metod, aby ukryć moją strzałkę przepełnienia (Visual Studio 2010) .Jedyną rzeczą, która wydawała się wpływać na strzałkę, był powyższy przykład Toolbar_Load, ale wszystko, co zrobiło, to zmienić strzałkę pusta przestrzeń, która wyglądała tak źle jak strzała. Najłatwiejszym sposobem, jaki mogłem zrozumieć, było po prostu ustawienie marginesów paska narzędzi.

<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
źródło
0

Powyższe metody działają w celu ukrycia przepełnienia; Użyłem następujących sposobów, aby ukryć chwytak:

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

dla układu poziomego i

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

dla układu pionowego. Umieść powyższe za Toolbar (lub ToolbarTray, jeśli go używasz)

Użyj dowolnej szerokości i wysokości potrzebnej dla twoich przycisków.

Kaxaml jest doskonały do ​​zabawy z tymi rzeczami.

frediano
źródło