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

Желаемый результат заключается в том, что красная рамка этикетки должна находиться на расстоянии 44 пикселя от рамки окна (поле + отступы).

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

Думаю, если я не найду никакого решения, я создам именованный стиль для жадности, где я установлю поля/отступы, затем я буду переходить окно за окном и устанавливать стиль сетки, но это последний вариант, который я хочу сделать.< br> Заранее спасибо.


person Shimmy Weitzhandler    schedule 03.01.2010    source источник


Ответы (2)


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

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

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

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

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

Вот полный шаблон (сгенерированный с помощью 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>
person itowlson    schedule 03.01.2010
comment
Я пробовал, и, к сожалению, это не работает. Я предполагаю, что причина в том, что когда вы нацеливаете окно с помощью ControlTemplate.DataType, вы нацеливаете только базовый класс Window, но не Window1, который наследуется от окна. Я ошибаюсь? Кроме того, я думаю, что возиться с шаблоном может быть опасно, поскольку он может содержать другие определения, которые я потеряю. Что сказать, я должен сдаться и сделать план Б? - person Shimmy Weitzhandler; 03.01.2010
comment
Хм, я не пробовал подход с ключом стиля по умолчанию, но он обычно хорошо работает с производными классами (поскольку они наследуют ключ стиля по умолчанию от базового класса). Но вы по-прежнему можете создать стиль как ресурс уровня приложения и явно ссылаться на него через StaticResource. Повторная возня с шаблоном, эй, для этого и нужны шаблоны! *усмехается* Если вы сомневаетесь, установите надстройку Reflector BAML Viewer и посмотрите, есть ли шаблон окна по умолчанию, который вы можете адаптировать (извините, он не установлен здесь, поэтому не могу проверить сам). - person itowlson; 03.01.2010

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

person Danny Beckett    schedule 06.09.2013