我正在开发一个应用程序,它将有很多窗口,每个窗口的基本布局相同:
- 一个主窗口
- 在左上角有一个标志
- 一个标题块
- 底部有一个状态显示器
- 一个用于窗口特定控件的区域。
目前,我必须在每个窗口中重新创建此结构。理想情况下,我希望将这个布局编码到单个位置,可能是为了方便使用而编写的自定义窗口子类。是否有人对如何入手或类似问题有过经验?
我正在开发一个应用程序,它将有很多窗口,每个窗口的基本布局相同:
目前,我必须在每个窗口中重新创建此结构。理想情况下,我希望将这个布局编码到单个位置,可能是为了方便使用而编写的自定义窗口子类。是否有人对如何入手或类似问题有过经验?
您可以创建一个新的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>
为什么你要使用“许多窗口”呢?为什么不只用一个带选项卡控件的窗口?或者只有一个窗口和用户控件?
无论如何,回答你的问题,用户控件是实现你想要的功能的一种方式。
创建一个新的Window类,并使其具有“Childrens”属性,该属性允许将对象嵌入到您想要放置“特定于窗口的控件”的停靠面板中。
当您启动新的窗口时,实例化窗口类型和具有特定控件的用户控件,将用户控件添加到窗口的Children属性中,然后显示窗口。您甚至可以在此时绑定事件处理程序、DataContext等。