从无视控制按钮捕获事件

时间:2011-12-28 21:02:59

标签: silverlight xaml mvvm controltemplate

我创建了一个在Silverlight 4项目中使用的无外观控件。此控件包含一个按钮,我想捕获click事件。 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变量始终为null,因此事件处理程序永远不会附加。你能告诉我哪里出错了吗?我是一个新手,所以如果这是完全错误的方法,那么任何关于正确方法的建议也将得到很好的接受

1 个答案:

答案 0 :(得分:1)

重写OnApplyTemplate方法并将代码放在那里而不是控件的构造函数:

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

因为在构造函数调用期间,控件的可视化树尚未构建。来自MSDN OnApplyTemplate

  

将类定义的事件处理程序附加到模板的某些部分。对于   例如,您可能希望类逻辑处理来自a的KeyDown事件   TextBox模板部分,以便更新UI状态和其他事件   而是提出了特定于你的控制的。