2012-01-24 12 views
14

Quiero establecer un Margen de 3 predeterminado en todos los controles que pongo en todas mis ventanas y poder anular este valor solo en unos pocos artículos.¿Cómo establecer un Margen predeterminado para todos los controles en todas mis ventanas de WPF?

He visto algunos enfoques, como hacer estilos, pero luego tengo que diseñar todo, preferiría algo que no se pueda hacer para todos los controles juntos. He visto otras cosas como el MarginSetter, pero parece que no atraviesa subpaneles. Quiero el margen solo en los controles que coloco en la ventana, nada que ver con los bordes u otras cosas del árbol visual.

Parece algo muy básico para mí. ¿Algunas ideas?

Gracias de antemano.

+0

fronteras son controles. ¿Qué pasa con el uso de estilos? Si usa Wpf, eche un vistazo a los estilos implícitos, los que se pueden aplicar a un tipo específico (se supone que SL5 también los tiene). –

+0

@Dmitry: lo que está mal es que necesitaré crear un estilo para cada control creado por quienquiera que use. Esto no parece una gran solución teniendo en cuenta que todos los controles tienen clases base y que la herencia se usa para evitar este tipo de cosas (repetir cosas siempre está mal cuando se programa) –

+0

¿Has leído lo que dije? Usa un estilo implícito - se aplica en un tipo en lugar de en un nivel de instancia. –

Respuesta

17

La única solución que puedo encontrar es aplicar el estilo a cada uno de los controles que está usando en la ventana (sé que eso no es exactamente lo que quiere). Si sólo está utilizando unos pocos tipos diferentes de control que no es demasiado onerosa para hacer algo como esto:

<Window x:Class="WpfApplication7.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 
     <!-- One style for each *type* of control on the window --> 
     <Style TargetType="TextBox"> 
      <Setter Property="Margin" Value="10"/> 
     </Style> 
     <Style TargetType="TextBlock"> 
      <Setter Property="Margin" Value="10"/> 
     </Style> 
    </Window.Resources> 
    <StackPanel> 
     <TextBox Text="TextBox"/> 
     <TextBlock Text="TextBlock"/> 
    </StackPanel> 
</Window> 

Buena suerte ...

+0

Bueno, la cosa es que Windows Form tiene un valor de Margen predeterminado ... y todo siempre necesita un conjunto de márgenes. Estaba buscando una solución genérica para aplicarla a todas mis aplicaciones. Parece que tendré que crear un estilo para cada control ... que puede doler teniendo en cuenta que tendré que mantener la maldita cosa para siempre. –

+0

Sí, esto es definitivamente una deficiencia en WPF. Si encuentro una mejor solución, la publicaré aquí. –

15

Puede enlazar todas sus propiedades de margen, haciendo referencia a un " Grosor "definido en sus recursos. Acabo de hacer esto en un proyecto ...

<!-- somwhere in a resource--> 
<Thickness x:Key="CommonMargin" Left="0" Right="14" Top="6" Bottom="0" /> 

<!-- Inside of a Style --> 
<Style TargetType="{x:Type Control}" x:Key="MyStyle"> 
    <Setter Property="Margin" Value="{StaticResource CommonMargin}" /> 
</Style> 
<!-- Then call the style in a control --> 
<Button Style="{StaticResource MyStyle}" /> 

<!-- Or directly on a Control --> 
<Button Margin="{StaticResource CommonMargin}" /> 

La clave para mí era averiguar que el margen se define por "Espesor". Avíseme si eso es suficientemente claro o si necesita que lo coloque en un ejemplo de XAML totalmente operativo.

1

Puede aplicar margen en el estilo de sus botones. Y cuando use botones con este estilo en StackPanel, wpf aplicará el espaciado de necesidad. por ejemplo definen en ResourceDictionary o lo que sea:

<Style x:Key="myButtonStyle" TargetType="{x:Type Button}"> 
<Setter Property="Margin" Value="10"/> 
.... 
</Style> 

después en yor StackPanel xaml definición:

<StackPanel> 
    <Border BorderThickness="0"/> 
    <Button x:Name="VertBut1" Style="{StaticResource myButtonStyle}"  Content="Button1"/> 
    <Button x:Name="VertBut2" Style="{StaticResource myButtonStyle}"  Content="Button2"/> 
    <Button x:Name="VertBut3" Style="{StaticResource myButtonStyle}"  Content="Button3"/> 
</StackPanel> 

respecto Georgi

+0

¿es posible agregar el estilo al panel de distribución y hacer que ese estilo se propague hacia abajo a todos los elementos secundarios? – BKSpurgeon

Cuestiones relacionadas