假如我们自定义了一个控件模板,里面有一个Slider控件,如何给它添加事件呢?
<Style TargetType="{x:Type s:ZoomBox}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type s:ZoomBox}">
<Border CornerRadius="1"
BorderThickness="0"
Background="#EEE"
BorderBrush="DimGray">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Slider Name="PART_ZoomSlider"
VerticalAlignment="Center"
HorizontalAlignment="Center"
Margin="0"
Ticks="25,50,75,100,125,150,175,200,225,250"
Minimum="25"
Maximum="250"
SmallChange="25"
LargeChange="25"
Value="100"
MinWidth="104"
MinHeight="21"
IsSnapToTickEnabled="True"
IsMoveToPointEnabled="False" />
<TextBlock Text="{Binding ElementName=PART_ZoomSlider, Path=Value}"
Grid.Column="1"
VerticalAlignment="Center"
HorizontalAlignment="Right"
Margin="0,0,14,0" />
<TextBlock Text="%"
Grid.Column="1"
VerticalAlignment="Center"
HorizontalAlignment="Right"
Margin="1,0,2,0" />
</Grid>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
这里要使用OnApplyTemplate方法,在该方法中找到Slider控件。
具体的,在自定义的ZoomBox类中,重写该方法,同时,在模板中,Slider的命名一定要是PART_Name形式,这样WPF就可以找到该控件,然后添加事件委托。
public Class ZoomBox
{
private Slider zoomSlider ;//slider成员变量
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
#region 搜索控件的模板元素
this.zoomSlider = Template.FindName("PART_ZoomSlider", this) as Slider;
this.zoomSlider.MouseWheel+= new MouseWheelEventHandler(this.Cus_MouseWheel);
if (this.zoomSlider == null)
throw new Exception("PART_ZoomSlider template is missing!");
#endregion
this.zoomSlider.ValueChanged += new RoutedPropertyChangedEventHandler<double>(this.ZoomSlider_ValueChanged);
}
}