Установите шаблон элемента управления по умолчанию для пользовательского элемента управления без использования стиля - PullRequest
1 голос
/ 17 октября 2019

Я ищу способ более прочного связывания по умолчанию 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, но я изо всех сил пытаюсь добраться до словаря ресурсов из кода;поэтому мне интересно, есть ли более эзотерический способ сделать это.

1 Ответ

1 голос
/ 17 октября 2019

Если вы не хотите определять значение по умолчанию Style, вы можете обработать событие Loaded в вашем классе управления и установить свойство Template в обработчике события.

public UnitTextBox() : base()
{
    this.Loaded += UnitTextBox_Loaded;
}

private void UnitTextBox_Loaded(object sender, RoutedEventArgs e)
{
    var res = this.FindResource("UnitTextBoxTemplate");
    this.Template = res as ControlTemplate;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...