WPF ToolBar: cómo eliminar el agarre y el desbordamiento

98

En un WPF ToolBarPanel-ToolBar-Menu anidado, queremos deshacernos del control de agarre a la izquierda y el área de desbordamiento a la derecha. Ambos están atenuados, pero nos gustaría que no se mostraran en absoluto.

¿Alguna idea sobre cómo lograrlo?

en caso de que mis términos no sean del todo correctos, si miras la imagen en la Figura 3 del enlace a continuación, en la más baja de las tres barras de herramientas está el agarre a la izquierda del menú desplegable y a la derecha de la más a la derecha botón hay el desbordamiento.

Imagen de barras de herramientas

Tom
fuente
Probablemente podría hacerlo sobrescribiendo la plantilla de control ... pero no lo recomendaría.
apandit
Puede poner Margin = "0,0, -14,0" en la barra de herramientas para empujar el lado derecho fuera de la vista. Esta es la solución más sencilla que he encontrado, pero solo la he probado con una única barra de herramientas, no dentro de un ToolBarPanel o un ToolBarTray.
Wayne Bloss

Respuestas:

153

El agarre se puede quitar estableciendo la propiedad adjunta ToolBarTray.IsLocked="True"en la barra de herramientas.

Para eliminar el Overflow ToggleButton , tendrá que eliminarlo en una ControlTemplate personalizada como sugieren las variables de seis letras, que si tiene una mezcla o puede descargar la Vista previa de Blend 3 no es demasiado difícil.

También puede ocultar el botón en el evento cargado de la barra de herramientas, aunque sea cual sea la ruta que tome, también debe establecer la propiedad adjunta ToolBar.OverflowMode="Never"en el menú de la barra de herramientas, de modo que los elementos no se desborden accidentalmente en un área inalcanzable.

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

Y establezca Overflow ToggleButton en contraído:

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
fuente
15
Surge la pregunta: ¿Por qué usar una barra de herramientas? ¿Por qué no usar un StackPanel simple con botones? ¿Qué beneficio ofrece ToolBar?
Josh G
5
En respuesta a Josh G: Si usa un botón transparente con una imagen en un panel normal (StackPanel, etc.), tendrá un contorno blanco. Sin embargo, cuando se coloca el mismo botón en una barra de herramientas, el contorno blanco no está presente.
Chris Bennet
2
Esto también es útil si desea la temática de una barra de herramientas en este contexto, por ejemplo, el comportamiento del mouse sobre el mouse.
Greg D
36
FYI: Puede usar un StackPanel simple y aún obtener el estilo de la barra de herramientas. <Button Style = "{StaticResource {x: Static ToolBar.ButtonStyleKey}}"> <Image Source = "{StaticResource ZoomIn}"> </Image> </Button>
2011
1
Además, descubrí que si no desea utilizar el control <Menu> dentro de su barra de herramientas, la propiedad ToolBar.OverflowMode = "Never" se puede establecer directamente dentro de su control <Button> dentro de su barra de herramientas. Esto creó el efecto que estaba buscando
Ford
8

Puede usar Blend para anular simplemente ControlTemplate para ToolBarPanel, Menu o ToolBar.

  1. Haga clic derecho en la barra de herramientas y seleccione Editar plantilla
  2. En Editar plantilla, seleccione Editar una copia
  3. Recomiendo agregar la copia a un diccionario de recursos
  4. Haga clic en Aceptar

Ahora editará la plantilla de control para ToolBarPanel y puede establecer la visibilidad en Contraído para la señal de agarre y desbordamiento. Puede enjuagar y repetir para los otros controles. Lleva un poco de tiempo, pero no es muy difícil con Blend.

usuario7116
fuente
Gracias por la info. desafortunadamente blend2 y vs2008 no parecen funcionar bien juntos para nosotros, hay demasiados problemas cuando uno trabaja con código generado en el otro, por lo que actualmente no permitimos que blend se acerque a nuestro código vs;)
Tom
1
Sí, usamos Blend de manera bastante religiosa hasta que apareció VS2k8SP1. En realidad, deseo que el editor de WPF en VS2k8 WAS Blend. Es mucho mejor poder hacer clic derecho en algo y decir Agrupar en 'StackPanel' o 'Border'. Lástima que la EM quiera que sean experiencias diferentes.
user7116
Creo que los nuevos XAML Power Toys agregan una función que le permite agrupar controles. (Tal vez sean los juguetes MoXAML Power ...)
Número 8
8

Puede "eliminar" el desbordamiento sin proporcionar una nueva plantilla de control configurando ToolBarpara que tenga márgenes derechos negativos (y agregue un margen izquierdo negativo para que no se vea extraño con bordes izquierdos redondeados pero bordes derechos cuadrados). Luego, agregue ClipToBounds="True"lo ToolBarPanelque cortará los bordes de la barra de herramientas que ahora se pegan fuera del área del panel.

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

En lugar de ocultar el botón de desbordamiento por completo, creo que es mejor mostrarlo solo cuando sea necesario. Esto se puede hacer vinculando su Visibilitypropiedad a su IsEnabledpropiedad:

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

(se puede hacer lo mismo en XAML redefiniendo la plantilla)

Thomas Levesque
fuente
3

Recién estoy comenzando con WPF y no pude obtener ninguno de los métodos anteriores para ocultar mi flecha de desbordamiento (Visual Studio 2010). Lo único que pareció afectar la flecha fue el ejemplo Toolbar_Load anterior, pero todo lo que hizo fue convertir la flecha en un espacio vacío que se veía tan mal como la flecha. La forma más fácil que pude imaginar fue simplemente establecer los márgenes de la barra de herramientas.

<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
fuente
0

Los métodos anteriores funcionan para ocultar el desbordamiento; He utilizado lo siguiente para ocultar la pinza:

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

para un diseño horizontal, y

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

para un diseño vertical. Coloque lo anterior después de la barra de herramientas (o la bandeja de la barra de herramientas, si la usa)

Utilice el Ancho y Alto que necesite para sus botones.

Kaxaml es excelente para jugar con estas cosas.

frediano
fuente