您可以使用包含 9 个单元格的网格来做到这一点。创建 8 个用户控件来保存您的外部内容。如果你想调整它的大小,你将不得不使用一点魔法。
每个角落的用户控件都有一个 2x2 的网格,对于左上角的面板,我将举一个小例子。
<UserControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:ec="http://schemas.microsoft.com/expression/2010/controls"
mc:Ignorable="d"
x:Class="TopLeft"
x:Name="UserControl"
d:DesignWidth="480" d:DesignHeight="480">
<Grid x:Name="LayoutRoot">
<Grid.RowDefinitions>
<RowDefinition Height="0.5*"/>
<RowDefinition Height="0.5*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0.5*"/>
<ColumnDefinition Width="0.5*"/>
</Grid.ColumnDefinitions>
<Rectangle Stroke="Black" Grid.RowSpan="2" Fill="Black"/>
<Rectangle Fill="Black" Stroke="Black" Grid.ColumnSpan="2"/>
<Path Grid.Column="1" Data="M0.5,0.5 L239.5,0.5 120,120 0.5,239.5 z" Fill="Black" Grid.Row="1" Stretch="Fill" Stroke="Black" />
</Grid>
</UserControl>
在上面的示例中,一个 2 x 2 的网格,右下角有一条对角线路径。如果您的主窗口要调整大小,您必须决定您的边框区域是相应调整大小还是作为窗口主体周围的静态框架。
这是窗口:
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:MegaPanel"
x:Class="MainWindow"
x:Name="Window"
Title="MainWindow"
Width="640" Height="480">
<Grid x:Name="LayoutRoot">
<Grid.RowDefinitions>
<RowDefinition Height="0.3*"/>
<RowDefinition Height="0.3*"/>
<RowDefinition Height="0.3*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0.3*"/>
<ColumnDefinition Width="0.3*"/>
<ColumnDefinition Width="0.3*"/>
</Grid.ColumnDefinitions>
<local:TopLeft Margin="0"/>
</Grid>
</Window>
我未能在 UserControl 中放置内容演示者,但您可以将其放入其中以向其中添加内容。
必须小心处理窗口的主体区域。您可以将 Margin 设置为负值,以允许正文内容溢出到框架区域。
编辑
例子:
<local:TopLeft Margin="0">
<local:TopLeft.Tag>
<ListBox/>
</local:TopLeft.Tag>
</local:TopLeft>
上面对左上角的更改将 ListBox 分配给 TopLeft 用户控件的 Tag 属性。在 User 控件中,我将 ContentPresenter 绑定到 UserControl 的 Tag 属性。 ListBox 分配给标签,ContentPresenter 从标签中获取 ListBox。如果您想要多个领域的内容,您可以在 UserControl 代码隐藏中注册自定义属性。
<ContentPresenter Grid.RowSpan="2" Grid.ColumnSpan="2" Margin="0,0,125,125" Content="{Binding Tag, ElementName=UserControl}"/>
要注册自定义 DependencyProperties,请检查 this post out。