2012-01-24 17 views
14

Chcę ustawić domyślny margines 3 na wszystkie elementy sterujące, które umieszczam na wszystkich moich oknach i być w stanie zastąpić tę wartość tylko na naprawdę niewielu pozycjach.Jak ustawić domyślny margines dla wszystkich elementów sterujących we wszystkich moich oknach WPF?

Widziałem różne podejścia, takie jak robienie stylów, ale potem muszę wszystko stylizować, wolałbym coś, co można zrobić dla wszystkich elementów sterujących. Widziałem inne rzeczy, takie jak MarginSetter, ale wygląda na to, że nie przechodzi przez subpanele. Chcę Marży tylko na elementach sterujących, które umieszczam w oknie, nie ma to nic wspólnego z granicami czy innymi elementami wizualnego drzewa.

Wygląda dla mnie bardzo prosto. Jakieś pomysły?

Z góry dziękuję.

+0

granice są przyciski. co wykręcasz za pomocą stylów? Jeśli użyjesz Wpf, spójrz na niejawne style - te, które mogą być zastosowane dla określonego typu (SL5 również ma je mieć). –

+0

@Dmitry: co jest nie tak, muszę stworzyć styl dla każdej kontroli stworzonej przez kogokolwiek, z czego korzystam. To nie wygląda najlepiej, mając na uwadze, że wszystkie kontrolki mają klasy bazowe i że dziedziczenie jest używane do uniknięcia tego rodzaju rzeczy (powtarzanie rzeczy jest zawsze błędne podczas programowania) –

+0

Czy przeczytałeś to, co powiedziałem - użyj niejawnego stylu - oni stosować na poziomie typu, a nie na poziomie instancji. –

Odpowiedz

17

Jedyne rozwiązanie, jakie mogę znaleźć, to zastosowanie stylu do wszystkich kontrolek używanych w oknie (wiem, że to nie jest to, czego chcesz). Jeśli używasz tylko kilka różnych rodzajów kontroli nie jest to zbyt uciążliwe zrobić coś takiego:

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

Powodzenia ...

+0

Chodzi o to, że Windows Form miał domyślną wartość Margin ... a wszystko zawsze wymaga zestawu marginesów. Szukałem ogólnego rozwiązania, aby zastosować je do wszystkich moich aplikacji. Wygląda na to, że będę musiał stworzyć styl dla każdej kontroli ... która może zranić, mając na uwadze to, że będę musiał na zawsze utrzymać to cholerstwo. –

+0

Tak, to zdecydowanie niedociągnięcie w WPF. Jeśli znajdę lepsze rozwiązanie, opublikuję go tutaj. –

15

Można połączyć wszystkie swoje właściwości marginesów, odwołując się do " Grubość "zdefiniowana w twoich zasobach. I właśnie to zrobił w projekcie ...

<!-- 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}" /> 

Kluczem dla mnie było dowiedzieć się, że margines został określony przez „grubość”. Daj mi znać, jeśli jest to wystarczająco jasne lub jeśli potrzebujesz mnie, aby umieścić go w pełni działającym przykładzie XAML.

1

Możesz zastosować margines w swoim stylu przycisków. A kiedy użyjesz przycisków z tym stylem w StackPanel, wpf zastosuje odstępy między wierszami. np zdefiniowania ResourceDictionary lub cokolwiek:

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

wówczas yor definicji 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> 

odniesieniu Georgi

+0

czy można dodać styl do panelu stackpanel i czy ten styl propaguje się w dół do wszystkich elementów potomnych? – BKSpurgeon

Powiązane problemy