C# WFP Найти элемент управления в шаблоне элемента управления с переопределением DefaultStyleKeyProperty
Я скачал пример решения, в котором используется метод OverrideMetadata DefaultStyleKeyProperty элемента управления, который наследуется от usercontrol, но не имеет файла дизайна.xaml, и который будет базовым элементом управления для других элементов управления с аналогичным или почти одинаковым макетом. Код можно найти здесь Пример.
Сейчас я пытаюсь получить доступ из базового класса к кнопке, расположенной в его шаблоне содержимого с переопределенным стилем, с именем "btnTest1", но я не могу найти способ сделать это.
Я хотел бы знать, есть ли способ найти элемент управления в конструкторе базового класса или в конструкторе подкласса (возможно, после вызова InitializeComponent), потому что мне нужно иметь доступ к нему в коде позже.
Заранее спасибо.
Дэвид.
1 ответ
Для этого есть шаблон стиля.
В вашем файле control.cs вы хотите переопределить OnApplyTemplate
protected override void OnApplyTemplate(){
Button yourButtonControl = GetTemplateChild("TheNameOfYourButton") as Button;
base.OnApplyTemplate();
}
Если вы хотите следовать шаблону Microsoft, то сначала вы захотите назвать свой контроль "
PART_SomethingButton
Msgstr "Это просто означает, что это часть шаблона.Тогда в вашем
Control.cs
класс, добавитьattribute
на контроле.- Это говорит всем, кто переопределяет ваш стиль по умолчанию, что если они хотят, чтобы ваш код работал, им нужно иметь
Button
на их шаблон с именем PART_SomethingButton
- Это говорит всем, кто переопределяет ваш стиль по умолчанию, что если они хотят, чтобы ваш код работал, им нужно иметь
,
[TemplatePart(Name = "PART_SomethingButton", Type = typeof(Button))]
public class MyControl : Control
- Внутри вашего класса добавьте частный элемент управления Button.
- Мы будем использовать это для доступа к нашей кнопке на протяжении всего контроля
,
[TemplatePart(Name = "PART_SomethingButton", Type = typeof(Button))]
public class MyControl : Control{
private Button _partSomethingButton;
}
- Затем, наконец, установите вашу личную кнопку в шаблоне OnApplyTemplate.
- Это входит в шаблон и кэширует кнопку в нашем файле cs, чтобы мы могли манипулировать им или захватывать события из него.
,
[TemplatePart(Name = "PART_SomethingButton", Type = typeof(Button))]
public class MyControl : Control{
private Button _partSomethingButton;
protected override void OnApplyTemplate(){
_partSomethingButton = GetTemplateChild("PART_SomethingButton") as Button;
base.OnApplyTemplate();
}
}