You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF自定义Window模板如何添加Header、Footer等自定义区域?

实现带Header/Footer区域的自定义Window

步骤1:创建自定义Window子类

继承原生Window,添加Header和Footer依赖属性,让XAML能直接设置这两个区域的内容:

using System.Windows;

public class LayoutWindow : Window
{
    // Header依赖属性
    public static readonly DependencyProperty HeaderProperty =
        DependencyProperty.Register(nameof(Header), typeof(object), typeof(LayoutWindow));

    public object Header
    {
        get => GetValue(HeaderProperty);
        set => SetValue(HeaderProperty, value);
    }

    // Footer依赖属性
    public static readonly DependencyProperty FooterProperty =
        DependencyProperty.Register(nameof(Footer), typeof(object), typeof(LayoutWindow));

    public object Footer
    {
        get => GetValue(FooterProperty);
        set => SetValue(FooterProperty, value);
    }
}

步骤2:定义自定义Window样式(模板)

在资源字典里编写样式,模板中布局Header、主内容区、Footer三个区域,用ContentPresenter分别绑定对应的属性:

<Style x:Key="CustomWindowStyle" TargetType="{x:Type local:LayoutWindow}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:LayoutWindow}">
                <Grid>
                    <!-- 标题栏区域 -->
                    <ContentPresenter 
                        Content="{TemplateBinding Header}"
                        Margin="0,0,0,5"/>

                    <!-- 主内容区(对应Window的Content) -->
                    <ContentPresenter 
                        Content="{TemplateBinding Content}"
                        Margin="0,30,0,30"/>

                    <!-- 页脚区域 -->
                    <ContentPresenter 
                        Content="{TemplateBinding Footer}"
                        VerticalAlignment="Bottom"
                        Margin="0,5,0,0"/>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

注:可根据需求调整布局容器(比如DockPanel、StackPanel),也能添加窗口边框、拖动逻辑等细节。

步骤3:使用自定义Window

在XAML中用LayoutWindow作为根元素,设置样式后即可按需求定义Header、Footer和主内容:

<local:LayoutWindow Style="{StaticResource CustomWindowStyle}">
    <local:LayoutWindow.Header>
        <Grid x:Name="HeaderGrid" Background="#FF2C3E50">
            <TextBlock Text="自定义标题栏" Foreground="White" Padding="10" FontSize="14"/>
        </Grid>
    </local:LayoutWindow.Header>

    <!-- 主内容区 -->
    <Grid x:Name="ContentGrid" Background="#ECF0F1">
        <TextBlock Text="窗口主内容" HorizontalAlignment="Center" VerticalAlignment="Center"/>
    </Grid>

    <local:LayoutWindow.Footer>
        <Grid x:Name="FooterGrid" Background="#FF2C3E50">
            <TextBlock Text="自定义页脚" Foreground="White" Padding="10" HorizontalAlignment="Right"/>
        </Grid>
    </local:LayoutWindow.Footer>
</local:LayoutWindow>

关键说明

  • 你之前遇到的问题原因:资源字典的代码文件是ResourceDictionary子类,并非DependencyObject,无法定义依赖属性;而原生Window的XAML元素不识别自定义属性,所以必须通过子类化Window来扩展属性。
  • 这个方法完全兼容原生Window的所有功能,因为LayoutWindow直接继承自Window。

内容的提问来源于stack exchange,提问作者Notrum666

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 18:20:12