Я ищу способ более прочного связывания по умолчанию Control Template
моего пользовательского элемента управления с элементом управления вместо использования Style
. Я покажу свой простейший пример, чтобы объяснить необходимость:
public class UnitTextBox : TextBox
{
public string UnitLabel {...}
public static readonly DependencyProperty UnitLabelProperty =
DependencyProperty.Register("UnitLabel", typeof(string), typeof(UnitTextBox), new PropertyMetadata(""));
}
Этот элемент управления просто добавляет дополнительное строковое свойство для метки устройства (например, в миллиметрах), учитывая следующий простой шаблон элемента управления, полученный из TextBox
, он помещает метку единицы измерения в текстовое поле, чтобы все было красиво, чисто и с правильными размерами:
<ControlTemplate x:Key="UnitTextBoxTemplate" TargetType="{x:Type local:UnitTextBox}">
<Border x:Name="border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
<DockPanel>
<TextBlock DockPanel.Dock="Right" Text="{TemplateBinding UnitLabel}" VerticalAlignment="Center" HorizontalAlignment="Right" Margin="8,0,2,0" Focusable="False" IsHitTestVisible="False" Background="Transparent" Foreground="{TemplateBinding Foreground}"
FontSize="{TemplateBinding FontSize}" FontStyle="{TemplateBinding FontStyle}" />
<ScrollViewer x:Name="PART_ContentHost" Focusable="False" HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden"/>
</DockPanel>
</Border>
...(triggers)
</ControlTemplate>
Все это прекрасно работает, однако этот элемент управления по-прежнему по-прежнему TextBox
, и у меня многостилей для TextBox, которые я уже использую, поэтому я не хочу использовать стиль по умолчанию для применения шаблона:
<Style TargetType="{x:Type local:UnitTextBox}">
<Setter Property="Template" Value="{DynamicResource UnitTextBoxTemplate}"/>
</Style>
Выполнение вышеизложенного означает, что я не могу использовать свой стиль RegularTextBox
, которыйотлично работает для моего UnitTextBox
. Поэтому вместо этого каждый раз, когда я хочу добавить UnitTextBox
, я должен явно указать шаблон, который обеспечивает его правильную работу:
<ctrl:UnitTextBox Template="{DynamicResource UnitTextBoxTemplate}" UnitLabel="mm/min"
Style="{StaticResource RegularTextBox}"/>
Я работал с WPF целую вечность, но у меня относительно мало пользовательскихкогда я это делаю, но с этим они столкнулись с методом «Стиль по умолчанию», но я думаю, что должен быть лучшим способом, но google-fu не давал мне покоя.
IЯ надеюсь, что есть некоторый способ назначить шаблон в подпрограмме конструктора / Init UnitTextBox
, но я изо всех сил пытаюсь добраться до словаря ресурсов из кода;поэтому мне интересно, есть ли более эзотерический способ сделать это.