Вы на правильном пути, но работаете слишком усердно ...
Следует помнить об элементах пользовательского интерфейса в WPF - они работают в слоях. Думайте об элементах как о совокупности более мелких предметов, которые вы хотите разместить в трехмерном пространстве. Вы больше не просто работаете в двумерном пространстве рисования, как в пространстве визуализации GDI WinForms.
Итак, давайте логически подумаем о том, что вы хотите сделать здесь. Давайте попробуем достичь нескольких целей в нашем решении:
- Позволяет создать шаблон элемента управления, который позволит нам повторно использовать наш недавно отчеканенный элемент управления.
Позволяет сделать элемент управления полностью переносимым в трехмерном пространстве, т. е. не использовать растровые изображения, которые будут искажаться, если мы изменим размеры нашего элемента управления - давайте придерживаться геометрии только для рисования.
Позволяет легко решить, насколько велика треугольник в углу.
Давайте решим, что потом можно будет легко вносить изменения, такие как размещение треугольника (вы хотите изменить его местоположение), тестирование попадания (если оно является частью поверхности текста). или граница?), цвет (опять же, граница или текст?) и т. д. c.
Хорошо, чтобы решить эту проблему, я ссылался на идею объектов в слоях. Давайте разделим нашу поверхность рисования на сетку:
Это означает, что мы хотим использовать элемент управления Grid
. Мы хотим определить две строки и два столбца, и мы хотим, чтобы TextBox
охватывал все 4 ячейки. Мы обязательно установим Rowspan
и Columnspan
для заполнения сетки.
Затем мы добавим второй элемент, наш Polyline
треугольник в строку 1 столбца 1, и добавим его после текстовое поле. Таким образом, Z-порядок будет сверху.
Вот тогда шаблон управления:
<Window.Resources>
<Style x:Key="TriangleTextBox" TargetType="{x:Type TextBox}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TextBox}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="10"/>
<RowDefinition Height="6*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="6*" />
<ColumnDefinition Width="10" />
</Grid.ColumnDefinitions>
<TextBox Grid.Row="0" Grid.Column="0" Grid.RowSpan="2" Grid.ColumnSpan="2" Margin="0,0,0,0" Text="{TemplateBinding Text}" BorderThickness="1"/>
<Polygon Grid.Row="0" Grid.Column="1" Points="0,0 10,0 0,10 0,0" Fill="Black" FlowDirection="RightToLeft"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
Обратите внимание, что мы установили ключ в "TriangleTextBox".
Теперь просто использовать наш шаблон управления следующим образом:
<Grid>
<TextBox Style="{StaticResource ResourceKey=TriangleTextBox}" Width="100" Height="20"/>
</Grid>
И вот он у вас:
Вы можете расширить это оттуда.