我创建了一个在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,因此事件处理程序永远不会附加。你能告诉我哪里出错了吗?我是一个新手,所以如果这是完全错误的方法,那么任何关于正确方法的建议也将得到很好的接受
答案 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状态和其他事件 而是提出了特定于你的控制的。