题
所以我正在构建一个具有大量窗口的应用程序,所有窗口都具有相同的基本布局:
- 主窗口
- 顶角的徽标
- 标题栏
- 底部的状态显示器
- 窗口特定控件的区域。 醇>
目前我必须在每个窗口中重新创建此结构。理想情况下,我希望将此布局编码在一个位置,也许可以放入自定义Window子类中以便于使用。有没有人知道如何开始,或以前遇到类似问题的经历?
解决方案
您可以创建一个以窗口为目标的新ControlTemplate,如下所示。
<ControlTemplate x:Key="WindowControlTemplate1" TargetType="{x:Type Window}">
<Border
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="0.93*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0.21*"/>
<ColumnDefinition Width="0.79*"/>
</Grid.ColumnDefinitions>
<ContentPresenter
Grid.ColumnSpan="2"
Grid.Row="1"
Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}"
/>
<ResizeGrip
HorizontalAlignment="Right"
x:Name="WindowResizeGrip"
VerticalAlignment="Bottom"
IsTabStop="False"
Visibility="Collapsed"
Grid.Column="1"
Grid.Row="2"
/>
<TextBlock Text="My Logo" />
<TextBlock Grid.Column="1" Text="My Title"/>
<StatusBar Height="20" Grid.ColumnSpan="2" Grid.Row="2"/>
</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>
其他提示
如果你有足够的勇气进行大规模的架构转变,你可以考虑 CompositeWPF (之前代号为Prism) )来自Patterns&amp;在微软实践这些人。
您感兴趣的是定义“区域”的能力。在shell(即窗口)中,然后使用视图填充区域。它使用Model-View-Presenter模式允许独立开发“视图”模式。从模型中可以很容易地重新定位,因为shell只定义区域,而不是直接耦合到放置到它的内容。主要是这有助于将shell与视图和视图相互分离,从而更容易进行单元测试......等等,等等等等。
虽然你的情况是CompositeWPF要解决的应用程序类型之一,但这是一个很大的跳跃,会让你慢慢开始。
作为CompositeWPF的一部分,您需要采用可能使新手混淆的各种模式,例如: UnityContainer,控制反转,MVP(或模型/视图/视图模型)和依赖注入。
我记得当我第一次开始使用示例应用程序时感到困惑,因为一些视图甚至在创建之前并不明显!统一容器将实例化对象并神奇地调用参数化构造函数。
CompositeWPF是您问题的优雅解决方案,但不是简单或直接的解决方案。在我上一个项目中使用了CompositeWPF后,我打算再次将它用于下一个合适的应用程序。
最简单的方法是将WPF创建为“页面”。对于窗口特定控件并放置“框架”。在主窗口中。你甚至可以通过这种方式创建一个漂亮的导航。
为什么你正在使用“大量的窗户?”为什么不只是一个带有标签控件的窗口?或者是一个带有用户控件的窗口?
无论如何,要回答你的问题,usercontrols是你想要获得你想要的功能的一种方式。
创建一个新的Window类,并让它具有“Childrens”类。允许对象嵌入到您想要“窗口特定控件”的停靠面板中的属性。去吧。
在启动新窗口时,实例化窗口类型和具有特定控件的用户控件,将用户控件添加到窗口的Children属性,然后显示窗口。您甚至可以绑定事件处理程序,DataContexts以及此时不支持的内容。