захватывать события с помощью кнопки управления - PullRequest
0 голосов
/ 29 декабря 2011

Я создал элемент управления без внешнего вида, который будет использоваться в проекте Silverlight 4.Этот элемент управления содержит кнопку, и я хотел бы захватить событие щелчка.Generic.xaml содержит

<Style TargetType="TU:MyControl">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="TU:MyControl" >
                <Border Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}" d:DesignWidth="550" d:DesignHeight="228">
                    <Grid Background="Silver">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="150*"/>
                            <ColumnDefinition Width="60"/>
                            <ColumnDefinition Width="150*"/>
                        </Grid.ColumnDefinitions>
                        <Border Grid.Column="0" Margin="2" BorderBrush="DarkGray" BorderThickness="3"></Border>
                        <Border Grid.Column="2" Margin="2" BorderBrush="DarkGray" BorderThickness="3"></Border>
                        <StackPanel Grid.Column="1">
                            <Button Name="PART_MyClick"  Height="32" Width="32" Margin="0,8,0,0"></Button>
                        </StackPanel>
                    </Grid>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

После исследования проблемы я считаю, что мне нужно добавить следующий атрибут в мой класс управления

[TemplatePart(Name = "PART_MyClick", Type = typeof(Button))]

Затем в конструкторе элементов управления я добавилследующий код

var myClick = GetTemplateChild("PART_MyClick") as Button;
if(myClick != null)
{
    myClick.Click += (o, e) => DoThings();
}

при запуске, хотя переменная myClick всегда равна нулю, поэтому обработчик событий никогда не присоединяется.Не могли бы вы сказать мне, где я иду не так?Я новичок, поэтому, если это неправильный подход полностью, то любые советы по правильному подходу также будут с благодарностью приняты

1 Ответ

1 голос
/ 29 декабря 2011

Переопределите метод OnApplyTemplate и поместите туда свой код вместо конструктора элемента управления:

public override void OnApplyTemplate()
{
    base.OnApplyTemplate();
    var myClick = GetTemplateChild("PART_MyClick") as Button;
    if(myClick != null)
    {
        myClick.Click += (o, e) => DoThings();
    }
}

Поскольку во время вызова конструктора визуальное дерево для элемента управления еще не создано.От MSDN OnApplyTemplate :

Присоединение определяемых классом обработчиков событий к частям шаблона.Например, вы можете захотеть, чтобы логика класса обрабатывала события KeyDown из части шаблона TextBox, чтобы обновлялись состояния пользовательского интерфейса и вместо этого возникали другие события, характерные для вашего элемента управления.

...