Window.Margin & Window.Padding не работают

Я устанавливаю Peroperty Margin и Padding окна и не вступает в силу:

Вот пример:

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    SizeToContent="WidthAndHeight"
    ResizeMode="NoResize"
    Padding="22"
    Margin="22">

    <Grid>
        <Label 
            FontWeight="Bold"
            FontSize="36"
            BorderThickness="1"
            BorderBrush="Red"
            Content="Hello world!"/>
    </Grid>
</Window>

Результат:
alt text

Желаемый результат состоит в том, что красная рамка из лабиринта должна отсутствовать 44px из оконной рамки (margin + padding).

Да, я знаю, что могу установить поле метки, но это не то, что я хочу. У меня есть целый проект, в котором все его окна установлены в стиле, я хочу установить эти свойства (или другие) в общий стиль окна.

Я думаю, если я не найду какое-либо решение, я создам именованный стиль для жадности, где я установлю margin/padding, тогда я перейду Окно по окну и задаю стиль Grid, но последний вариант, который я хочу сделать.
Заранее спасибо.

Ответы

Ответ 1

Не удивительно, что Margin не работает, потому что Margin - это объем пространства, который должен быть размещен вокруг элемента управления. Для Window это означало бы сделать кадр меньшим (и смещенным), а не клиентской областью, и это было бы немного странно (и может не очень хорошо играть с хостинговой средой Win32, не уверен). Немного удивительно, что Padding не работает, и я не знаю, почему это было бы.

Однако есть обходное решение, которое вы можете инкапсулировать в стиле: замените по умолчанию Window ControlTemplate своим собственным шаблоном, который уважает Padding:

<ControlTemplate TargetType="Window">
  <Border Background="White" Padding="{TemplateBinding Padding}">
    <ContentPresenter />
  </Border>
</ControlTemplate>

(Вероятно, вы хотите, чтобы фон Border был кистью динамического окна для производственного кода, но вы поняли эту идею.)

Очевидно, вы можете поместить этот шаблон в шаблон Template setter, чтобы избежать необходимости повторять его в каждом окне.

Вот полный шаблон (сгенерированный с помощью Microsoft Expression):

<Style x:Key="WindowStyle" TargetType="{x:Type Window}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Window}">
                <Border Background="{TemplateBinding Background}"
                    BorderBrush="{TemplateBinding BorderBrush}"
                    BorderThickness="{TemplateBinding BorderThickness}"
                    Margin="{TemplateBinding Margin}"
                    Padding="{TemplateBinding Padding}">

                    <AdornerDecorator>
                        <ContentPresenter/>
                    </AdornerDecorator>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <Trigger Property="ResizeMode" Value="CanResizeWithGrip">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type Window}">
                        <Border Background="{TemplateBinding Background}"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}">

                            <Grid>
                                <AdornerDecorator>
                                    <ContentPresenter/>
                                </AdornerDecorator>
                                <ResizeGrip
                                    x:Name="WindowResizeGrip"
                                    HorizontalAlignment="Right"
                                    VerticalAlignment="Bottom"
                                    IsTabStop="false"
                                    Visibility="Collapsed"
                                />
                            </Grid>
                        </Border>
                        <ControlTemplate.Triggers>
                            <MultiTrigger>
                                <MultiTrigger.Conditions>
                                    <Condition
                                        Property="ResizeMode"
                                        Value="CanResizeWithGrip"
                                    />
                                    <Condition 
                                        Property="WindowState"
                                        Value="Normal"
                                    />
                                </MultiTrigger.Conditions>
                                <Setter 
                                    Property="Visibility"
                                    TargetName="WindowResizeGrip"
                                    Value="Visible"/>
                            </MultiTrigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Trigger>
    </Style.Triggers>
</Style>

Ответ 2

Вот простая альтернатива: просто установите цвет фона на Window и Margin на Grid в пределах Window: