Можно ли установить одну сторону поля или отступа, чтобы не переопределять стиль по умолчанию?

#.net #wpf #.net-4.0

#.net #wpf #.net-4.0

Вопрос:

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

Фрагмент моего словаря ресурсов выглядит следующим образом:

 <ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <Style TargetType="Button">
        <Setter Property="Margin" Value="4"/>
        <Setter Property="MinWidth" Value="75"/>
        <Setter Property="Padding" Value="10,2"/>
    </Style>

</ResourceDictionary>
  

Обратите внимание, что я устанавливаю поле равным 4 для всех сторон. Это здорово, поскольку обеспечивает промежуток между кнопками без необходимости явного определения его интерфейсом. Я хочу знать, как я могу с помощью одной кнопки убрать пробел с одной стороны без необходимости определять «4» для других сторон, чтобы позволить ей прилегать к стороне своего родителя.

Я не хочу делать следующее, поскольку это отклоняется от стиля (т. Е. Если я изменю 4 на 5 в своем стиле, мне также нужно сделать это здесь):

 <DockPanel>
    <Button DockPanel.Dock="Left" Content="My Button" Margin="0,4,4,4" />
</DockPanel>
  

Я просто хочу как-то установить MarginLeft и оставить остальные в качестве стиля по умолчанию, который я определил.

ПРИМЕЧАНИЕ: У меня есть обходной путь, который заключается в простом использовании именованного стиля «buttonLeft», который определен в словаре ресурсов без левого поля.

Ответ №1:

я думаю, что ваш обходной путь подходит 🙂 если вам нужно свойство marginLeft, вы должны создать свою собственную кнопку и добавить это свойство.

Комментарии:

1. Я думал, что смогу получить такой ответ, спасибо blindmeis 🙂 Я думал, что мог бы заставить WPF вести себя больше как CSS: P У меня действительно есть baseButton стиль, на котором также основан мой стиль по умолчанию, а затем есть два именованных стиля для leftButton и rightButton соответственно. Спасибо за сообщение 🙂

Ответ №2:

Понимая, что на этот вопрос уже дан ответ, я все равно решил протестировать это в XAMLPad:

 <UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
         MinWidth="500" MinHeight="200">
    <UserControl.Resources>
            <Style TargetType="Button">
            <Setter Property="Margin" Value="6"/>
            <Setter Property="MinWidth" Value="75"/>
            <Setter Property="Padding" Value="10,2"/>
        </Style>
</UserControl.Resources>
<Grid>
    <Grid.Margin>
        <Thickness Top="20" />
    </Grid.Margin>
    <Button Content="Test" />
</Grid>
  

Однако, похоже, что это позволяет добавить 20 к 6, что дает 26 в качестве верхнего поля и 6 слева, справа и снизу.

Итак, если бы я хотел 20, мне пришлось бы поставить 14.

Комментарии:

1. Это правильно, поскольку сетка содержит кнопку, и это толщина сетки, которая объединяется с кнопкой. Теоретически вы могли бы обернуть кнопку в Border , привязать свойство borders Margin к свойству inner buttons Margin в сочетании с преобразователем типов, который сводит на нет левое поле кнопок, чтобы эффективно изменить его положение. Это могло бы быть жизнеспособным решением, хотя это зависит от того, какая из них требует меньше работы 🙂 Со вторым, возможно, меньше работы для начала.

2. Ах да, как я это пропустил! 1 за это,