2012-01-24 11 views
14

Voglio impostare un Margine predefinito di 3 su tutti i controlli che ho messo su tutte le mie finestre ed essere in grado di sovrascrivere questo valore solo su un numero davvero esiguo di elementi.Come impostare un Margine predefinito per tutti i controlli su tutte le mie finestre WPF?

Ho visto alcuni approcci come fare gli stili ma poi ho bisogno di disegnare tutto, preferirei qualcosa che si possa fare per tutti i controlli insieme. Ho visto altre cose come il MarginSetter ma sembra che non attraversi i sottopannelli. Voglio il margine solo sui controlli che ho messo alla finestra, niente a che fare con i bordi o altre cose dell'albero visivo.

Sembra qualcosa di abbastanza semplice per me. Qualche idea?

Grazie in anticipo.

+0

confini sono i controlli. cosa c'è di male nell'usare gli stili? Se usi Wpf dai uno sguardo agli stili impliciti - quelli che possono essere applicati per un tipo specifico (SL5 dovrebbe averli anche tu). –

+0

@Dmitry: ciò che è sbagliato è che avrò bisogno di creare uno stile per ogni controllo creato da chiunque io usi. Questa non sembra una grande soluzione avendo in mente che tutti i controlli hanno classi base e che l'ereditarietà viene usata per evitare questo tipo di cose (le cose ripetitive sono sempre sbagliate durante la programmazione) –

+0

Hai letto quello che ho detto - usa lo stile implicito - loro si applica a un tipo piuttosto che a un livello di istanza. –

risposta

17

L'unica soluzione che riesco a trovare è applicare lo stile a ciascun controllo che si sta utilizzando sulla finestra (so che non è proprio quello che si desidera). Se si sta utilizzando solo alcuni tipi di controllo differenti che non sia troppo oneroso per fare qualcosa di simile:

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

Buona fortuna ...

+0

Bene, il fatto è che Windows Form ha un valore Margine predefinito ... e tutto ha sempre bisogno di un margine impostato. Stavo cercando una soluzione generica per applicarlo a tutte le mie applicazioni. Sembra che dovrò creare uno stile per ogni controllo ... che può far male avere in mente che dovrò mantenere quella maledetta cosa per sempre. –

+0

Sì, questo è sicuramente un difetto in WPF. Se trovo una soluzione migliore, la posterò qui. –

15

È possibile collegare tutte le proprietà dei margini facendo riferimento ad una " Spessore "definito nelle tue risorse. Ho appena fatto questo in un progetto di ...

<!-- 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 chiave per me era capire che il margine è stato definito da "spessore". Fatemi sapere se questo è abbastanza chiaro o se avete bisogno di me per metterlo in un esempio XAML pienamente funzionante.

1

È possibile applicare il margine nello stile dei pulsanti. E quando usi i pulsanti con questo stile in StackPanel, wpf applicherà la necessità di spaziatura. per esempio definire in ResourceDictionary o qualsiasi altra cosa:

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

poi nel yor definizione StackPanel XAML:

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

riguarda Georgi

+0

è possibile aggiungere lo stile allo stackpanel e avere lo stile propagato in basso a tutti gli elementi figlio? – BKSpurgeon