Мне не известны какие-либо встроенные функции, которые могут это сделать, но вы можете написать собственный элемент управления для этого.
Основной частью такого элемента управления будет сетка из 9 частей, в которой 4 части имеют фиксированный размер (углы), две части имеют фиксированную высоту и переменную ширину (центральная верхняя часть и центральная нижняя часть), две части имеют фиксированную ширину и переменные высоты (левый центр и правый центр), и последняя часть имела переменную высоту и ширину (середина). Растягивание только в одном направлении (например, создание кнопки, которая растет только горизонтально) так же просто, как ограничение высоты средней части.
В XAML это будет:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="20"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="20"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="20"/>
<RowDefinition Height="*"/>
<RowDefinition Height="20"/>
</Grid.RowDefinitions>
</Grid>
Затем вы добавили бы объекты для рисования изображений (я буду использовать прямоугольники), а также объект для помещения контента (ContentPresenter):
<Rectangle Grid.Row="0" Grid.Column="0" x:Name="TopLeft"/>
<Rectangle Grid.Row="0" Grid.Column="1" x:Name="TopCenter"/>
<Rectangle Grid.Row="0" Grid.Column="2" x:Name="TopRight"/>
<Rectangle Grid.Row="1" Grid.Column="0" x:Name="CenterLeft"/>
<Rectangle Grid.Row="1" Grid.Column="2" x:Name="CenterRight"/>
<Rectangle Grid.Row="2" Grid.Column="0" x:Name="BottomLeft"/>
<Rectangle Grid.Row="2" Grid.Column="1" x:Name="BottomCenter"/>
<Rectangle Grid.Row="2" Grid.Column="2" x:Name="BottomRight"/>
<Grid Grid.Row="2" Grid.Column="1" x:Name="Middle">
<Rectangle/>
<ContentPresenter x:Name="MiddleContent"/>
</Grid>
Каждый из прямоугольников можно нарисовать с помощью ImageBrush, чтобы они отображали правильную часть исходного изображения:
<Rectangle>
<Rectangle.Fill>
<ImageBrush ImageSource="Image.png" TileMode="None"
<!-- Add the settings necessary to show the correct part of the image --> />
</Rectangle.Fill>
</Rectangle>
Обернув все это в пользовательский элемент управления, вы можете создать довольно удобный 9-фрагментный элемент управления изображением:
<local:NineSliceImage Image="Source.png" Slice="20,20">
<TextBox Text="Nine Slice Image TextBox!"/>
</local:NineSliceImage>
Где Slice - это свойство типа System.Windows.Size, так что вы можете использовать его как Margin / Padding / и т.д. свойства для установки положения срезов.
Вы также захотите установить для SnapToDisplayPixels значение True для всех прямоугольников; в противном случае вы увидите небольшие промежутки между частями изображения при определенных разрешениях, так как WPF пытается интерполировать промежуточные пиксели.
Альтернативный, немного более быстрый способ сделать это, если вы планируете использовать множество этих элементов управления, - переопределить OnRender и сделать это там; Я делал это в прошлом для управления 3-фрагментным изображением, но это немного сложнее.
Это должно помочь вам пройти большую часть пути - если я что-то упустил, оставьте комментарий.