如何对模板化控件中的按钮单击做出反应

时间:2014-07-16 14:39:05

标签: c# wpf

我编写了一个自定义模板控件,其中包含一个按钮:

<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!");
    }
}

知道如何对点击的事件做出反应吗?

2 个答案:

答案 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)

好吧,我自己解决了。无法将Clicked事件传递给基类。但是,可以在加载模板时访问该按钮,让他订阅点击的事件,如下所示:

protected override void OnApplyTemplate()
{
    Button PreviousPageButton = (Button)GetTemplateChild("PreviousPageButton");
    PreviousPageButton.Click += PreviousPageButton_Click;
}