Es posible hacer que los elementos dentro de una WPF barra de herramientas tiene un HorizontalAlignment de Derecho?

<ToolBar Height="38" VerticalAlignment="Top" Grid.Row="1">
    <Button HorizontalAlignment="Left" Width="50" VerticalAlignment="Stretch"/>
    <Button HorizontalAlignment="Left" Width="50" VerticalAlignment="Stretch"/>
    <ComboBox Width="120" HorizontalAlignment="Right"/>
</ToolBar>

He intentado añadir los elementos dentro de una Cuadrícula y la asignación de las ColumnDefinitions a la Izquierda/Derecha. También he probado un StackPanel. No importa lo que yo trato me parece que no puede obtener el control ComboBox para estar «anclado» en el lado derecho de la Barra de herramientas.

ACTUALIZACIÓN:

<DockPanel LastChildFill="True">

No funciona, no va a llenar la Barra de herramientas del elemento como lo haría un elemento normal.

OriginalEl autor jsmith | 2010-02-04

8 Comentarios

  1. 15

    Investigaciones posteriores mostraron que, para hacer esto necesito para establecer el ancho de una Grid dentro de la ToolBar, o como Chris Nicol dijo, un DockPanel dentro de la ToolBar de forma dinámica a la de la anchura de la Toolbar utilizando RelativeSource.

    Sin embargo, esto no se siente como una solución limpia. Es bastante complicado conseguir el Toolbar para actualizar correctamente sobre cómo cambiar el tamaño. Así que en su lugar he encontrado algo de un hack que se ve, y opera más limpio.

    <ToolBar Height="38" VerticalAlignment="Top" Grid.Row="1">
        <Button HorizontalAlignment="Left" Width="50" VerticalAlignment="Stretch"/>
        <Button HorizontalAlignment="Left" Width="50" VerticalAlignment="Stretch"/>
    </ToolBar>
    
    <ComboBox Margin="0,0,15,0" Width="120" HorizontalAlignment="Right" Grid.Row="1"/>

    Ya que todos mis elementos en una Cuadrícula, puedo realizar mi ComboBox en la parte superior de la ToolBar mediante la asignación es Grid.Row a la misma fila de la barra de herramientas. Después de la configuración de mi Margins para tirar de la ComboBox más ligeramente que no interfiera con la mira, opera como sea necesario sin errores. Desde la otra única manera que he encontrado para hacer esto fue la creación de un DockPanel/Cuadrícula de propiedad Width de forma dinámica, de hecho, me siento como este es el limpiador de la manera más eficiente de hacerlo.

    Realmente esto me parece una genial (y muy cuidada) solución. He visto afectados por este problema para siempre. Gracias!
    Esto es realmente una idea brillante. Gracias!
    Bastante, bastante, bastante bueno.
    Simple y brillante solución de un pie de largo dolor en la rabadilla 🙂
    Esto hará que su derecho alineado elemento (en su caso ComboBox) para flotar sobre la barra de herramientas de objetos si se cambia el tamaño (debido a la ventana de cambio de tamaño) hasta el punto donde el extremo derecho de la barra de herramientas del elemento es de todo el camino a la derecha.

    OriginalEl autor jsmith

  2. 3

    Para cualquier persona en busca de una solución, el siguiente trabajó para mí:

    <ToolBar HorizontalAlignment="Stretch" ToolBarTray.IsLocked="True">
      <ToolBar.Resources>
        <Style TargetType="{x:Type DockPanel}">
          <Setter Property="HorizontalAlignment" Value="Right" />
        </Style>
    </ToolBar.Resources>

    Estoy usando .NET 4.6 y VS2015, pero creo que esto podría funcionar en versiones anteriores también.

    OriginalEl autor dotNET

  3. 2

    Has probado a utilizar un DockPanel que se llena la barra de herramientas, a continuación, puede acoplar el ComboBox a la derecha.

    Recuerde que con una dockpanel la secuencia de poner los elementos en es muy importante.

    HTH

    ¿Cómo llenar la barra de herramientas con un DockPanel? He intentado y sólo lo puede hacer de forma dinámica.. a Menos que haya algo que no me doy cuenta de que éste es el problema con la Barra de herramientas. Que es por qué esto no funciona para mí.
    sólo super ocupado con el trabajo en el momento, voy a publicar una solución de este fin de semana que debe sentir un poco más limpia.

    OriginalEl autor Chris Nicol

  4. 2
        <ToolBar Width="100" VerticalAlignment="Top" >
            <ToolBar.Resources>
                <Style TargetType="{x:Type ToolBarPanel}">
                    <Setter Property="Orientation" Value="Vertical"/>
                </Style>
            </ToolBar.Resources>
    
            <DockPanel>
                <ToolBarPanel Orientation="Horizontal" >
                    <Button>A</Button>
                    <Button>B</Button>
                </ToolBarPanel>
                <Button DockPanel.Dock="Right" HorizontalAlignment="Right">C</Button>
            </DockPanel>
        </ToolBar>

    WPF Elementos de Barra de herramientas HorizontalAligment=

    OriginalEl autor Mark Cidade

  5. 1

    Mi solución fue crear un control de etiqueta con una «primavera» como la capacidad, por lo que sería capaz de llenar el vacío entre los botones de la barra de herramientas, por lo que «a la derecha de la alineación de» la barra de herramientas del combobox (o cualquier otro control que necesita «alineado a la derecha).

    Para ello, he creado un WidthConverter, que tomaría el Ancho Real de la Barra de herramientas de Control y, a continuación, resta el espacio necesario necesario a la derecha de alinear el combobox.:

    public class WidthConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return Math.Max(System.Convert.ToDouble(value) - System.Convert.ToDouble(parameter), 0.0);
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

    Entonces, he añadido una etiqueta de control a la barra de herramientas, situada a la izquierda de la combobox que usted necesita a la derecha alineado. Se unen Ancho de la etiqueta de la barra de herramientas del ActualWidth y aplicar la WidthConverter:

    <Label Width="{Binding Converter={StaticResource WidthConverter}, ElementName=toolBar1, Path=ActualWidth, ConverterParameter=50}" />

    Usted tendrá que ajustar el ConverterParameter a sus necesidades específicas, hasta obtener la deseada «alinear a la derecha». Un número más alto proporciona más espacio para el combobox, mientras que un menor número ofrece menos espacio.

    El uso de esta solución, la etiqueta cambiará de tamaño automáticamente cada vez que tu barra de herramientas cambia de tamaño, lo que hace que parezca que usted tiene derecho alineado el combobox.

    Hay dos de gran beneficio para esta solución en comparación con la adición de una cuadrícula de la barra de herramientas. La primera es que si usted necesita para utilizar los botones en la barra de herramientas, usted no perderá el botón de la barra de estilo. La segunda es que el desbordamiento funcionará como se espera si la barra de herramientas de la longitud se reduce a través de la ventana de cambio de tamaño. Botones individuales voy a entrar en el desbordamiento de como se requiere. Si los botones se colocan en una rejilla, a continuación, la red es poner en el desbordamiento de tomar todos los botones con ella.

    XAML de ella en uso:

    <ToolBarPanel>
        <ToolBar Name="toolBar1">
            <Button>
                <Image Source="save.png"/>
            </Button>
        <Label Width="{Binding Converter={StaticResource Converters.WidthConverter},
                      ElementName=toolBar1,
                      Path=ActualWidth,
                      ConverterParameter=231}" HorizontalAlignment="Stretch" ToolBar.OverflowMode="Never"/>
        <Button>
            <Image Source="open.png"/>
        </Button>
    </ToolBar>

    Si usted desea mantener siempre el último botón de la barra de herramientas, por ejemplo un botón de ayuda que usted desea siempre visible, agregue el atributo de la Barra de herramientas.OverflowMode=»Nunca» a su elemento.

    La solución parece más limpio. Sin embargo, no puedo hacer que funcione para mí. ¿Puede dar un ejemplo completo de una barra de herramientas con un botón a la izquierda y otro a la derecha?
    Actualizada la respuesta a incluir un ejemplo. El primer botón alinear a la izquierda, y el segundo, el botón de la derecha alineado. Usted tendrá que ajustar el Parámetro de Convertidor para obtener el resultado deseado.

    OriginalEl autor PocketDews

  6. 1

    Esta es la forma en que lo hice:

    He creado un estilo de la barra de herramientas

        <Style x:Key="{x:Type ToolBar}" TargetType="{x:Type ToolBar}">
        <Setter Property="SnapsToDevicePixels" Value="true" />
        <Setter Property="OverridesDefaultStyle" Value="true" />
        <Setter Property="HorizontalAlignment" Value="Stretch"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ToolBar}">
                    <Grid Background="{StaticResource ToolGridBackground}">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto"/>
                            <ColumnDefinition Width="*"/>
                            <ColumnDefinition Width="Auto"/>
                        </Grid.ColumnDefinitions>
                        <Image Grid.Column="0" Style="{StaticResource LogoImage}"/>
                        <ToolBarPanel Grid.Column="2" x:Name="PART_ToolBarPanel" IsItemsHost="true" Margin="0,1,2,2" Orientation="Horizontal"/>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

    La parte importante es :

    <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto"/>
                            <ColumnDefinition Width="*"/>
                            <ColumnDefinition Width="Auto"/>
                        </Grid.ColumnDefinitions>

    Y

    <ToolBarPanel Grid.Column="2"/>

    Con esto, los botones se justifica a la derecha

    Esto funciona, pero es malo porque estamos completamente de colocación de la plantilla de la Barra de herramientas y por lo tanto perder el estilo predeterminado.

    OriginalEl autor Daniel

  7. 0

    No estoy muy satisfecho con el «WidthConverter» solución porque tengo algunos elementos dinámicos en la final. Además de la búsqueda me llevó a aquí, que parece ser el trabajo perfecto para mí. Aquí está mi ejemplo de código en caso de que te interese:

    <ToolBar Name="toolBar">
        <DockPanel Width="{Binding Path=ActualWidth, RelativeSource={RelativeSource AncestorType={x:Type ToolBarPanel}}}">
            <DockPanel.Resources>
                <Style TargetType="{x:Type Button}" BasedOn="{StaticResource {x:Static ToolBar.ButtonStyleKey}}"></Style>
            </DockPanel.Resources>
            <Button x:Name="btnRefresh" ToolTip="Refresh" Click="btnRefresh_Click">
                <Image Margin="2 0" Source="/Resources/refresh.ico" Height="16" Width="16"/>
            </Button>
            <StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
                <Image Margin="2 0" Source="/Resources/Help.ico" Height="16" Width="16"/>
                <TextBlock Text="Help" Margin="2 0" VerticalAlignment="Center"/>
            </StackPanel>
        </DockPanel>
    </ToolBar>
    Ah, este enfoque no funciona perfectamente cuando la ventana cambia de tamaño.
    Esto no funciona porque todos los botones de barra de herramientas desaparecen si se reduce el tamaño de la ventana. De lo contrario, funciona perfecto. Por lo tanto, sería genial si hay un pequeño ajuste a este enfoque para hacer que funcione.
    Bueno, he encontrado otro post en social.msdn.microsoft.com/Forums/en-US/wpf/thread/… (de dhbusch2) que realmente funciona a la perfección para mí, excepto que tengo que aplicar un estilo al botón como Style=»{StaticResource {x:Estática de la Barra de herramientas.ButtonStyleKey}}»

    OriginalEl autor newman

  8. 0

    Me doy cuenta de que este es un viejo tema, pero todavía aparece cuando la pregunta. Esta es la forma en que yo manejo esta pregunta:

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition x:Name="MenuRow"    Height="25"/>
            <RowDefinition x:Name="ToolbarRow" Height="25"/>
            <RowDefinition x:Name="CatalogRow" Height="*"/>
            <RowDefinition x:Name="RecipeRow"  Height="0.4*"/>
        </Grid.RowDefinitions>
        <ToolBar Grid.Row="1">
            <Button x:Name="tbFileOpen" Margin="0,0,0,0" Click="MenuItem_Click"><Image Source="Icons/Main/File/Load.png"/></Button>
            <Button x:Name="tbFileSave" Margin="0,0,0,0" Click="MenuItem_Click"><Image Source="Icons/Main/File/Save.png"/></Button>
            <Button x:Name="tbFileClear" Margin="0,0,0,0" Click="MenuItem_Click"><Image Source="Icons/Main/File/New document.png"/></Button>
        </ToolBar>
        <ToolBar Grid.Row="1" HorizontalAlignment="Right">
            <Button x:Name="tbFileExit" Margin="0,0,0,0" Click="MenuItem_Click"><Image Source="Icons/Main/File/Exit.png"/></Button>
        </ToolBar>
    </Grid>

    Efectivamente: yo cree dos de la barra de herramientas objetos y tenerlos en la misma Cuadrícula.la fila. La primera de ellas tiene por defecto (izquierda) de la alineación, el segundo se justifica a la derecha. Parece hacer el truco para mí.

    OriginalEl autor Leo Prast

Dejar respuesta

Please enter your comment!
Please enter your name here