我编写了一个自定义模板控件,其中包含一个按钮:
<ControlTemplate TargetType="local:IncrementalFlipView">
<Border
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
<StackPanel Orientation="Horizontal" Grid.Row="1" HorizontalAlignment="Center">
<Button Content="^" x:Name="PreviousPageButton" Click="Button_Click"/>
<TextBlock Text="1" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="10,0" FontSize="16" />
<Button Content="v" x:Name="NextPageButton"/>
</StackPanel>
</Border>
</ControlTemplate>
我的问题是,我不知道如何对按钮的点击事件做出反应。我在模板控件的代码中实现了一个Button_Click(object sender, RoutedEventArgs e)
事件处理程序,但它没有捕获按钮的单击事件。
public sealed class IncrementalFlipView : Control
{
public IncrementalFlipView()
{
this.DefaultStyleKey = typeof(IncrementalFlipView);
}
private void Button_Click(object sender, RoutedEventArgs e)
{
Debug.WriteLine("Clicked!");
}
}
知道如何对点击的事件做出反应吗?
答案 0 :(得分:2)
正确的方式(我的观点)是使用Command Bindings
。
模板化控件中的样式按钮将如下所示:
<Button Command="{Binding DataContext.BackCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type YourUIType}}}" CommandParameter="{Binding}" />
AncestorType
的类型取决于您使用的UI元素。
在主窗口中,您应该定义Command
:
private RelayCommand _backCommand;
public ICommand BackCommand
{
get { return _backCommand ?? (_backCommand = new RelayCommand(Back)); }
}
如果您通过互联网,您会看到RelayCommand
界面的基本ICommand
定义(请参阅[此处])。1
然后,您只需要定义Back
方法(它有一个参数化对象):
private void Back(object obj)
{
// Go back command
...
}
答案 1 :(得分:0)
protected override void OnApplyTemplate()
{
Button PreviousPageButton = (Button)GetTemplateChild("PreviousPageButton");
PreviousPageButton.Click += PreviousPageButton_Click;
}