只需使用网格对其进行模板化。在此示例中,我使用纯色填充矩形,只需使用从图像中适当的源矩形中提取像素的图像画笔替换那些:
<Button HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<Button.Template>
<ControlTemplate>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="100"/>
<RowDefinition Height="1*"/>
<RowDefinition Height="50"/>
<RowDefinition Height="1*"/>
<RowDefinition Height="100"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="1*"/>
<ColumnDefinition Width="50"/>
<ColumnDefinition Width="1*"/>
<ColumnDefinition Width="100"/>
</Grid.ColumnDefinitions>
<Rectangle Grid.Row="0" Grid.Column="0" Fill="CornflowerBlue"/>
<Rectangle Grid.Row="0" Grid.Column="1" Fill="Yellow"/>
<Rectangle Grid.Row="0" Grid.Column="2" Fill="CornflowerBlue"/>
<Rectangle Grid.Row="0" Grid.Column="3" Fill="Yellow"/>
<Rectangle Grid.Row="0" Grid.Column="4" Fill="CornflowerBlue"/>
<Rectangle Grid.Row="1" Grid.Column="0" Fill="Green"/>
<Rectangle Grid.Row="1" Grid.Column="4" Fill="Green"/>
<Rectangle Grid.Row="2" Grid.Column="0" Fill="CornflowerBlue"/>
<Rectangle Grid.Row="2" Grid.Column="4" Fill="CornflowerBlue"/>
<Rectangle Grid.Row="3" Grid.Column="0" Fill="Green"/>
<Rectangle Grid.Row="3" Grid.Column="4" Fill="Green"/>
<Rectangle Grid.Row="4" Grid.Column="0" Fill="CornflowerBlue"/>
<Rectangle Grid.Row="4" Grid.Column="1" Fill="Yellow"/>
<Rectangle Grid.Row="4" Grid.Column="2" Fill="CornflowerBlue"/>
<Rectangle Grid.Row="4" Grid.Column="3" Fill="Yellow"/>
<Rectangle Grid.Row="4" Grid.Column="4" Fill="CornflowerBlue"/>
<Rectangle Grid.Row="1" Grid.Column="1" Grid.RowSpan="3" Grid.ColumnSpan="3" Fill="Gray"/>
</Grid>
</ControlTemplate>
</Button.Template>
</Button>
结果:
老实说,尽管我认为这是可能需要自定义 UserControl 的情况之一,即使该控件使用我在此处展示的相同技术。在整个 XAML 中需要多次引用每列和每行拆分的确切点,将这些点作为依赖属性添加到用户控件中将使代码更加灵活且更易于定制。为了让您了解我在说什么,这里是前两个矩形在 XAML 中的样子:
<Rectangle Grid.Row="0" Grid.Column="0">
<Rectangle.Fill>
<ImageBrush ImageSource="http://i.stack.imgur.com/something.jpg" Viewbox="0,0,100,100" ViewboxUnits="Absolute"/>
</Rectangle.Fill>
</Rectangle>
<Rectangle Grid.Row="0" Grid.Column="1">
<Rectangle.Fill>
<ImageBrush ImageSource="http://i.stack.imgur.com/something.jpg" Viewbox="100,0,1,100" ViewboxUnits="Absolute" TileMode="None"/>
</Rectangle.Fill>
</Rectangle>
注意“something.jpg”是如何在两个矩形中引用的。模板化 Image 而不是 UserControl 将允许您使用 TemplateBinding 到 Image 源,但是仍然存在剪切行和列的位置的问题。你可以结合附加属性和转换器来做到这一点,但这太愚蠢了。创建一个自定义用户控件并完成它。