Как добавить обработчик события к объекту в ControlTemplate - PullRequest
0 голосов
/ 23 июля 2011

Как программно добавить обработчик событий к объекту, который существует только в ControlTemplate другого объекта?

Я работаю с Silverlight 4. Я хочу использовать элемент управления ColorSelector из сторонней библиотеки DLL (Liquid).Похоже на комбобокс, но реализован по-другому.(Вероятно, он был создан для более старой версии Silverlight, когда не было системы ComboBox.) Класс ColorSelector является производным от ContentControl, и его внешний вид реализован с использованием ControlTemplate, определенного в файле xaml.

Фактически этоэлемент управления, который выглядит как поле со списком, но программно его объект не является производным от поля со списком.И теперь я застрял, потому что я хотел бы программно получить доступ к объекту со списком, который я вижу на экране.Обычно, если бы это был настоящий стандартный ComboBox, я бы использовал события DropDownOpened и DropDownClosed, чтобы знать, когда окно отображается и скрывается соответственно.Но этот селектор цвета не предоставляет эти события.Но он использует ControlTemplete, который определяет внешний вид ColorSelector как объекта DropDown.Этот класс DropDown является другим классом из той же библиотеки DLL, и его внешний вид также определяется его ControlTemplate, и именно здесь основан этот таинственный комбо-подобный вид.И теперь я полностью смущен всем этим.

Как я могу программно получить доступ к этим визуальным элементам управления, которые я вижу на экране, но непосредственно не присутствует в коде?Вот один простой пример:

class ColorSelector : LiquidControl
class LiquidControl : ContentControl

<Style TargetType="local:ColorSelector">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local:ColorSelector">
                <local:DropDown x:Name="RootElement">
                .....
                </local:DropDown>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

class DropDown : LiquidControl

<Style TargetType="local:DropDown">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local:DropDown">
                <Grid x:Name="RootElement">
                    <Button x:Name="ElementButton">
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Теперь я создаю новый ColorControl в своем коде (new ColorControl()), а затем я хотел бы получить доступ к этой кнопке, определенной в шаблоне DropDown.Как это сделать?

Ответы [ 2 ]

1 голос
/ 23 июля 2011

Я считаю, что у вас нет исходного кода для элемента управления. Попробуйте это: Расширьте ColorSelector переопределить OnApplyTemplate, позвоните GetTemplateChild, чтобы получить кнопку.

public override void OnApplyTemplate()
{
   var button = this.GetTemplateChild("ElementButton") as Button;
   .... Do whatever with button
   base.OnApplyTemplate();
}
0 голосов
/ 24 июля 2011

Я нашел решение моей проблемы со сменой оригинальной DLL.Это основано на ответе, данном anivas.Я поставил этот код на DropDown.OnApplyTemplate:

        ElementPopup.Opened += (s, ea) => { DropDownOpened(this, ea); };
        ElementPopup.Closed += (s, ea) => { DropDownClosed(this, ea); };

Эти два события сигнализируют, когда выпадающий список открывается и закрывается соответственно.(Combobox реализован с использованием тех шаблонов, которые я раньше не понимал, есть объект Popup для отображения открытого комбинированного списка.)

Затем, аналогично, я добавил аналогичный код в ColorSelector.OnApplyTemplate:

        _dropDown.DropDownOpened += (s, ea) => { DropDownOpened(this, ea); };
        _dropDown.DropDownClosed += (s, ea) => { DropDownClosed(this, ea); };

Теперь у меня есть два новых события в ColorSelector, которые сигнализируют, когда он открывается или закрывается.И это то, что я хотел.

Спасибо anivas!Его ответ не сработал сам по себе, но показал, с чего начать.(Если я получил класс ColorSelector, я потерял его шаблон и перенаправленные события. А также он использует DropDown, который тоже должен быть изменен.)

...