2012-01-24 4 views
14

Я хочу установить по умолчанию маржу по умолчанию для всех элементов управления, которые я накладываю на все мои окна, и иметь возможность переопределить это значение только на очень немногих элементах.Как установить маржу по умолчанию для всех элементов управления во всех моих WPF-окнах?

Я видел некоторые подходы, такие как стили, но тогда мне нужно все стилизовать, я бы предпочел что-то, чем можно было бы сделать для всех элементов управления вместе. Я видел другие вещи, такие как MarginSetter, но похоже, что он не пересекает подпанели. Я хочу, чтобы маржа была только на элементах управления, которые я помещал в окно, не имеет ничего общего с границами или другими вещами визуального дерева.

Выглядит что-то довольно основное для меня. Есть идеи?

Заранее спасибо.

+0

границы управления. что заставляет использовать стили? Если вы используете Wpf, посмотрите на неявные стили - те, которые могут применяться для определенного типа (предполагается, что у SL5 тоже есть их). –

+0

@ Dmitry: в чем-то не так, что мне нужно будет создать стиль для каждого элемента управления, созданного тем, кого я использую. Это не выглядит отличным решением, имея в виду, что все элементы управления имеют базовые классы и что наследование используется, чтобы избежать таких вещей (повторяющийся материал всегда неправильный при программировании) –

+0

Вы читали то, что я сказал - используйте неявный стиль - они получить применение в типе, а не на уровне экземпляра. –

ответ

17

Единственное решение, которое я могу найти, - применить стиль к каждому из элементов управления, которые вы используете в окне (я знаю, что это не совсем то, что вы хотите). Если вы используете только несколько различных типов управления это не слишком обременительно, чтобы сделать что-то вроде этого:

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

удачи ...

+0

Ну, дело в том, что у Windows Form было значение Margin по умолчанию ... и все всегда требуется набор полей. Я искал универсальное решение для применения ко всем моим приложениям. Похоже, мне нужно будет создать стиль для каждого элемента управления ..., который может повредить, имея в виду, что мне нужно будет поддерживать эту проклятую вещь навсегда. –

+0

Да, это определенно недостаток в WPF. Если я найду лучшее решение, я отправлю его здесь. –

15

Вы можете связать все ваши свойства Margin со ссылкой на " Толщина "определяется в ваших ресурсах. Я только что сделал это в проекте ...

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

Ключ для меня было выяснить, что маржа была определена «Толщина». Дайте мне знать, если это достаточно ясно или вам нужно, чтобы я включил его в полностью рабочий пример XAML.

1

Вы можете применить марку в стиле кнопок. И когда вы используете кнопки с этим стилем в StackPanel, wpf применит необходимый интервал. , например определить в ResourceDictionary или что угодно:

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

затем в йор определения 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> 

С уважением Георгий

+0

Можно ли добавить стиль в стек стеллажа и распространить этот стиль вниз на все дочерние элементы? – BKSpurgeon

Смежные вопросы