相同的标题&所有WPF窗口中的页脚

时间:2013-11-21 05:44:35

标签: wpf window

在我的项目中,我有相同的标题&所有窗口的页脚(我在此项目中有超过20个wpf窗口),只有内容已更改。这是WPF项目。如果它是一个asp.net我已经使用了母版页。

现在我复制粘贴标题&页脚所有的窗口。如果Header需要任何小的更改,我有力在所有的Windows标题中执行。有解决方案吗?

enter image description here

4 个答案:

答案 0 :(得分:3)

我不是100%确定“所有窗口”是什么意思,但一个好的方法是拥有headerfooter UserControls。

您可以根据需要设置它们(文字,颜色等), 然后,在你的所有窗口中,你可以拥有一个包含3个元素的网格,stackpanel,dockpanel,无论你想要什么,哪个都有header,然后是content,最后是你的{{1} }。


修改 根据评论:而不是这个:

footer

您可以拥有一个UserControls(简称为<Window ...> <StackPanel> <Label>one</Label> <Label>two </Label> <Label>three</Label> </StackPanel> </Window> ),然后您需要做的就是1:添加命名空间以便您可以使用它。
2.添加它就像你将添加任何其他控件。 3.享受可重用性。

步骤说明:

  1. 使用其余HeaderControl定义将其添加到您的窗口中:
    xmlns....

  2. 将第一个控件从标签更改为我们的资源:
    而不是xmlns:controls="clr-namespace:WpfApplication1"写:<Label>one</Label>

  3. example

答案 1 :(得分:1)

第1步:在app.xaml或共享的ResourceDictionary中使用页眉和页脚定义窗口样式。

<Style x:Key="HeaderFooterWindowStyle" TargetType="Window">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Window}">
                <Grid Background="{TemplateBinding Background}">
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto"/>
                        <RowDefinition Height="*"/>
                        <RowDefinition Height="Auto"/>
                    </Grid.RowDefinitions>

                    <!-- Header -->
                    <Border Grid.Row="0" Background="Red">
                        <TextBlock Text="Header"/>
                    </Border>

                    <!-- Body -->
                    <ContentPresenter Grid.Row="1"/>

                    <!-- Footer -->
                    <Border Grid.Row="2" Background="Red">
                        <TextBlock Text="Footer"/>
                    </Border>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

第2步:将样式设置为窗口。

Style="{StaticResource HeaderFooterWindowStyle}"

答案 2 :(得分:0)

为什么不从常规窗口创建自己的“MyWindow”类?

这是一种公平的惯例,而您需要覆盖/自定义标准Window组件。拥有新组件后,您应该编写一个自定义模板,以便以您想要的方式显示任何内容。

看看这里:http://msdn.microsoft.com/en-us/library/aa969824(v=vs.110).aspx

答案 3 :(得分:0)

我想你需要在每个窗口中指定页脚和页眉,但是你想拥有一致的外观和感觉。

通常,如果您想在内容周围添加一些可重复使用的可视内容,则应使用内容控件并编辑其模板。

如果您还需要为内容指定标题,则应使用HeaderedContentControl并编辑其模板。

如果您还需要指定页脚,只需创建自己继承自HeaderedContentControl的控件并指定Footer属性。

这是用法的替代:

<controls:HeaderFooterContentControl 
    Header="Some simple header" 
    Footer="There could be xaml footer as well!>
    <Grid>
        <!--Place your content here-->
    </Grid>
</controls:HeaderFooterContentControl>

和实施:

public class HeaderFooterContentControl : HeaderedContentControl
{
    public object Footer
    {
        get { return (object) GetValue(FooterProperty); }
        set { SetValue(FooterProperty, value); }
    }

    public static readonly DependencyProperty FooterProperty = DependencyProperty.Register("Footer", typeof (object), typeof (HeaderFooterContentControl));
}

和模板:

<Style TargetType="controls:HeaderFooterContentControl">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="controls:HeaderFooterContentControl">
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto" />
                        <RowDefinition />
                        <RowDefinition Height="Auto" />
                    </Grid.RowDefinitions>

                    <Border Grid.Row="0" Background="White">
                        <ContentControl Content="{TemplateBinding Header}"  Foreground="Red"
                                        ContentTemplate=""   />
                    </Border>

                    <Border Grid.Row="1" Background="Red">
                        <ContentControl Content="{TemplateBinding Content}" Foreground="White"
                                        ContentTemplate="{TemplateBinding ContentTemplate}"
                                        ContentTemplateSelector="{TemplateBinding ContentTemplateSelector}"/>
                    </Border>

                    <Border Grid.Row="2" Background="White">
                        <ContentControl Content="{TemplateBinding Footer}" Foreground="Red"  />
                    </Border>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

请注意,这与MVVM无关,但由于Header和Footer是依赖属性,因此可以在任何MVVM场景中轻松使用。

如果可能,我肯定会避免绑定到ControlTemplate中的viewmodel属性。