窗口的Margin和Padding属性无法正常工作

19

我正在设置窗口的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

期望的结果是标签的红色边框应该距离窗口边框(margin+padding)44像素。

是的,我知道我可以设置标签的margin,但这不是我想要的。 我有一个整个项目都设置了样式的窗口,我想在通用窗口样式中设置这些属性(或其他属性)。

我猜如果我找不到任何解决方案,我将创建一个名为“greed”的样式,其中我将设置margin/padding,然后我将逐个窗口地设置网格的样式,但那是我最不想做的选择。
提前感谢。

2个回答

11

Margin不起作用并不奇怪,因为Margin是控件周围要放置的空间量。对于窗口来说,这意味着要缩小(和偏移)框架而不是客户区域,这可能有点奇怪(并且可能与Win32托管环境不兼容,不确定)。让人有点惊讶的是Padding不起作用,我也不确定原因。

然而,有一个解决方法可以封装在样式中:使用自己的模板替换默认的Window ControlTemplate,这样就能够正确处理Padding了:

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

我尝试了,但不幸的是它不起作用。我猜原因是当你使用ControlTemplate.DataType来定位窗口时,你只能定位到Window基类而不能定位到继承自Window的Window1。我错了吗? 此外,我认为修改模板可能很危险,因为它可能包含其他定义,我会失去这些定义。 你怎么看?我应该放弃并执行计划B吗? - Shimmy Weitzhandler
嗯,我没有尝试默认样式键方法,但通常对派生类有效(因为它们从基类继承默认样式键)。但您仍然可以将样式创建为应用程序级资源,并通过StaticResource显式引用它。关于模板的问题,那就是模板的作用!如果您怀疑,可以获取Reflector BAML Viewer插件并查看是否有默认的Window模板可供调整(抱歉,我没有在此安装它,因此无法检查)。 - itowlson

7
这里有一个简单的替代方法:只需在你的Window上设置背景颜色,并在Window中的Grid上设置Margin:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接