2009-06-26 7 views
83

En un WPF anidado ToolBarPanel-ToolBar-Menu queremos deshacernos del asa de agarre a la izquierda y el área de desbordamiento a la derecha. ambos están atenuados, pero nos gustaría que no se muestren en absoluto.WPF ToolBar: cómo eliminar el agarre y el desbordamiento

alguna idea sobre cómo lograr eso?

por si acaso mis términos no son del todo correctos, si miran la imagen en la Figura 3 del siguiente enlace, en la barra de herramientas más baja está el control a la izquierda del menú desplegable ya la derecha de el botón de la derecha está el desbordamiento.

Image of toolbars

+0

Probablemente podría hacerlo sobreescribiendo la plantilla de control .. .pero no lo recomendaría. – apandit

+0

Puede poner Margen = "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 fácil que he encontrado, pero solo he probado con una sola ToolBar que no está dentro de ToolBarPanel o ToolBarTray. –

Respuesta

128

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

Para eliminar Overflow ToggleButton, tendrá que eliminarlo en una Plantilla de Control personalizada como lo sugiere sixlettervariables, que si ha mezclado o puede descargar la Vista previa de la Mezcla 3 no es demasiado difícil.

También puede simplemente ocultar el botón en el caso de carga de la barra de herramientas, a pesar de que sea la ruta que tome, también debe establecer la propiedad adjunta ToolBar.OverflowMode="Never" en el menú de la barra de herramientas, por lo que los artículos no puede accidentalmente desbordamiento en un área de cobertura.

<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 establecer el desbordamiento ToggleButton a colapsado:

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

Implica la pregunta: ¿Por qué utilizar una barra de herramientas en absoluto? ¿Por qué no usar simplemente un StackPanel con botones? ¿Qué beneficio proporciona el ToolBar? –

+3

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. –

+1

Esto también es útil si desea tematizar una barra de herramientas en este contexto, p. el comportamiento mouseover. –

8

Puede use Blend to rather simply override the ControlTemplate para la ToolBarPanel, Menú o barra de herramientas.

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

Usted Ahora editaré la plantilla de control para el ToolBarPanel, y puedo configurar la visibilidad en Colapsado para la señal de control y desbordamiento. Puede enjuagar y repetir para los otros controles. Es un poco lento, pero no es terriblemente difícil con Blend.

+0

gracias por la información. Desafortunadamente, blend2 y vs2008 no parecen funcionar bien para nosotros, demasiados problemas cuando uno trabaja con código generado en el otro, por lo que actualmente no permitimos que la mezcla se acerque a nuestro código vs;) – Tom

+1

Sí, utilizamos Blend fair religiosamente hasta que apareció VS2k8SP1. En realidad, me gustaría que el editor de WPF en VS2k8 WAS Blend. Mucho mejor para poder hacer clic derecho en algo y decir Agrupar en 'StackPanel' o 'Borde'. Lástima que MS quiera que sean experiencias diferentes. – user7116

+0

Creo que los nuevos XAML Power Toys agregan una característica que le permite agrupar controles. (Tal vez es el MoXAML Power Toys ...) – Number8

0

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

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

para una disposición 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 barra de herramientas, si la usa)

Use el ancho y la altura que necesite para sus botones.

Kaxaml es excelente para jugar con estas cosas.

2

Estoy empezando con WPF y no pude obtener ninguno de los métodos anteriores para ocultar mi flecha de desbordamiento (Visual Studio 2010).Lo único que parecía afectar la flecha era el ejemplo de Toolbar_Load anterior, pero todo lo que hacía era 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 averiguar fue solo 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> 
+2

Ninguna funciona para mí. Visual Studio 2015 –

3

Usted puede "eliminar" el desbordamiento sin proporcionar una nueva plantilla de control al establecer la ToolBar tener márgenes negativas adecuadas (y el tiro en un margen izquierdo negativo por lo que no se ve rara, con bordes redondeados, pero que dejan cuadrada bordes derechos). Luego, agregue ClipToBounds="True" al ToolBarPanel que 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"> 
    . . . 
3

En lugar de ocultar por completo el botón de desbordamiento, creo que es mejor mostrarlo solo cuando sea necesario. Esto se puede hacer mediante la unión de su propiedad Visibility a su propiedad 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; 
    } 
} 

(lo mismo se puede hacer en XAML mediante la redefinición de la plantilla)

Cuestiones relacionadas