在我的项目中,我有相同的标题&所有窗口的页脚(我在此项目中有超过20个wpf窗口),只有内容已更改。这是WPF项目。如果它是一个asp.net我已经使用了母版页。
现在我复制粘贴标题&页脚所有的窗口。如果Header需要任何小的更改,我有力在所有的Windows标题中执行。有解决方案吗?
答案 0 :(得分:3)
我不是100%确定“所有窗口”是什么意思,但一个好的方法是拥有header
和footer
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.享受可重用性。
步骤说明:
使用其余HeaderControl
定义将其添加到您的窗口中:
xmlns....
将第一个控件从标签更改为我们的资源:
而不是xmlns:controls="clr-namespace:WpfApplication1"
写:<Label>one</Label>
答案 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属性。