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();
}
  1. Если вы хотите следовать шаблону Microsoft, то сначала вы захотите назвать свой контроль "PART_SomethingButtonMsgstr "Это просто означает, что это часть шаблона.

  2. Тогда в вашем Control.cs класс, добавить attribute на контроле.

    • Это говорит всем, кто переопределяет ваш стиль по умолчанию, что если они хотят, чтобы ваш код работал, им нужно иметь Button на их шаблон с именем PART_SomethingButton

,

[TemplatePart(Name = "PART_SomethingButton", Type = typeof(Button))]
public class MyControl : Control
  1. Внутри вашего класса добавьте частный элемент управления Button.
    • Мы будем использовать это для доступа к нашей кнопке на протяжении всего контроля

,

[TemplatePart(Name = "PART_SomethingButton", Type = typeof(Button))]
public class MyControl : Control{
     private Button _partSomethingButton;
}
  1. Затем, наконец, установите вашу личную кнопку в шаблоне 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();
    }
}
Другие вопросы по тегам