wpf toolbar

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



(6)

En un WPF ToolBarPanel-ToolBar-Menu anidado deseamos 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.

alguna idea sobre cómo lograr eso?

en caso de que mis términos no sean del todo correctos, si miras la imagen en la Figura 3 del enlace de abajo, en la barra de herramientas más baja está el control a la izquierda del menú desplegable ya la derecha de la derecha botón allí es el desbordamiento.

Imagen de barras de herramientas


En lugar de ocultar por completo el botón de desbordamiento, creo que es mejor mostrarlo solo cuando sea necesario. Esto puede hacerse vinculando 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 redefiniendo la plantilla)


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 de la barra de herramientas 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 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>


Los métodos anteriores funcionan para ocultar el desbordamiento; He usado 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 barra de herramientas, si usa eso)

Usa el ancho y la altura que necesites para tus botones.

Kaxaml es excelente para jugar con esto.


Puede "eliminar" el desbordamiento sin suministrar una nueva plantilla de control configurando la ToolBar de ToolBar para que tenga márgenes negativos a la derecha (e introduzca un margen izquierdo negativo para que no se vea extraño con bordes redondeados a la izquierda pero con bordes cuadrados rectos). 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"> . . .


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

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

Ahora va a editar la plantilla de control para ToolBarPanel, y puede establecer 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.


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

Para eliminar el Overflow ToggleButton , tendrá que eliminarlo en un ControlTemplate personalizado como sixlettervariables sugiere, que si ha mezclado o puede descargar el Blend 3 Preview no es demasiado difícil.

También podría 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 asociada ToolBar.OverflowMode="Never" en el menú de ToolBar, para que los elementos no puedan desbordarse 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 configure Overflow ToggleButton para que se contraiga:

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