WPF按钮单击事件不起作用

时间:2014-08-03 23:28:52

标签: c# wpf xaml

我有一个在网格中包含图片的按钮,我的问题是我无法使按钮Click事件正常工作。

我的XAML代码:

....
<TabControl TabStripPlacement="Left">
    <TabItem Loaded="ListProductsLoaded" Width="185" Height="100" Header="Lister les Produits">
        <Grid Background="#FFE5E5E5">
            <ListView Name="ProductsListView" IsHitTestVisible="False">
                <ListView.View>
                    <GridView>
                        <GridViewColumn Width="120" Header="Reference" DisplayMemberBinding="{Binding ProductReference}"></GridViewColumn>
                        <GridViewColumn Width="150" Header="Nom" DisplayMemberBinding="{Binding ProductName}"></GridViewColumn>
                        <GridViewColumn Width="120" Header="Photo" >
                            <GridViewColumn.CellTemplate>
                                <DataTemplate>
                                    <Button PreviewMouseLeftButtonDown="ImageButtonLeftMouseButtonDown" Name="ImageButton" Width="120" Height="120" Click="ImageButtonClicked">
                                        <Image Width="119" Height="119" Name="ProdImage" Source="{Binding ProductImage}"></Image>
                                    </Button>
                                </DataTemplate>
                            </GridViewColumn.CellTemplate>
                        </GridViewColumn>
                    </GridView>
                </ListView.View>
            </ListView>
        </Grid>
    </TabItem>
</TabControl>
....

正如您所看到的,我使用了两个事件PreviewMouseLeftButtonDown事件和Click事件,由于我在stackoverflow问题中看到的解决方案,我使用了PreviewMouseLeftButtonDown,但它没有用。两种事件方法都显示MessageBox

private void ImageButtonClicked(object sender, RoutedEventArgs e)
{
    MessageBox.Show(this, "clicked image button");
}

private void ImageButtonLeftMouseButtonDown(object sender, MouseButtonEventArgs e)
{
    MessageBox.Show("test clicked");
}

如果有人在遇到此问题之前请帮我解决,我搜索了一个没有成功的解决方案。提前谢谢。

编辑:即使我使用普通按钮:其中没有图像,也无法使用。

解决方案:实际上,我将IsHitTestVisible的选项TabControl设置为false并禁用所有Click个事件......对不起所有人。

3 个答案:

答案 0 :(得分:2)

您可以从XAML中删除所有事件订阅,并使用紧凑语法(只需一行代码)将其放在代码中,如下所示:

ImageButton.Click += (s, e) => { MessageBox.Show("test button clicked"); };

此外,删除您的事件处理过程:

private void ImageButtonClicked(object sender, RoutedEventArgs e)
{
    MessageBox.Show(this, "clicked image button");
}

除此之外,同一按钮(XAML中的PreviewMouseLeftButtonDown="ImageButtonLeftMouseButtonDown")的另一个事件处理程序似乎是多余的 - 您可以使用相应的事件处理过程将其删除。

因此,代码段应如下所示:

MainWindow()
{
    InitializeComponent();
    ImageButton.Click += (s, e) => { MessageBox.Show("test button clicked"); };

// ... the rest of the code...

与您的案例(Button模板中的ListView控件)相关,请参阅此文:WPF ListView with buttons on each line

答案 1 :(得分:0)

您的Click事件在代码隐藏中被命名为Test_OnClick,但在XAML中,您将其称为Click="ImageButtonClicked",因此事件不会触发。它必须是Click="Test_OnClick"

答案 2 :(得分:0)

在两个事件中尝试使用Tap事件而不使用click event.Same函数