WPF按钮点击事件无法工作

4

我有一个在Grid中包含Image的按钮,我的问题是无法使按钮的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事件,我使用PreviewMouseLeftButtonDown事件是因为我在stackoverflow问题中看到了一个解决方案,但它没有起作用。这两个事件方法都显示了一个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");
}

如果有人之前遇到过这个问题,请帮助我解决它,我搜索了很多但没有成功的解决方案。提前感谢。
编辑:即使我使用普通按钮:没有图像,它也不起作用。
解决方案:实际上,我将TabControlIsHitTestVisible选项设置为false,这禁用了所有的Click事件...对不起大家。

我曾经遇到过类似的问题:Button_Click 事件没有触发,因为我同时还有一个包含 e.Handled=trueButton_PreviewMouseUp 事件。当我把它移除后,Click 事件就正常工作了。 - MHN
4个回答

2
您可以使用紧凑的语法(只需一行代码)将XAML中的所有事件订阅都移至代码后备中,并保留HTML标记,示例如下:

您可以从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...

针对您的情况(在ListView模板中使用Button控件),请参考这篇文章:WPF ListView with buttons on each line


当我想在代码后台添加事件时,我无法访问按钮。无论是在窗口构造函数中还是在事件方法中 :o - Redaa
你给我的所有解决方案都没用,因为我无法访问ImageButton属性。 - Redaa
阅读修改后的帖子,它解释了如何实现。敬礼 - Alexander Bell
好的,我明白问题所在:这不仅仅是一个按钮,它是 ListView 模板中的一个按钮。请看看这个解决方案,可能会有帮助:https://dev59.com/nHRB5IYBdhLWcg3w9Lzn - Alexander Bell
我知道这是点击事件,我在谈论Button控件。XAML:<Button Name="testButton"/> CS:testButton.Click... 无法解析符号testButton。 - Redaa
此外,这个也可能有帮助:https://dev59.com/7Ww05IYBdhLWcg3wnjLC。谢谢。 - Alexander Bell

0

您的 Click 事件在代码后端中被命名为 Test_OnClick,但在 XAML 中您将其称为 Click="ImageButtonClicked",因此该事件无法触发。需要将其更改为 Click="Test_OnClick"


不,这不是我的确切的XAML,我不得不进行更改。但是像Test_OnClick一样的ImageButtonClicked方法是存在的。 - Redaa
Alex有一个好的解决方案,或者可以查看这个网址https://dev59.com/IW855IYBdhLWcg3wxHcq - user3904868
在代码后端,在以下行的后面添加语句到我的解决方案中: public MainWindow(){ InitializeComponent(); - Alexander Bell

0
尝试在不使用click事件的情况下使用Tap事件。在两个事件中使用相同的功能。


0

按钮的点击事件正在工作。 在您点击和按钮的OnClick()方法之间可能触发的代码中删除任何断点。(例如OnPreviewMouseDown等) 我不知道Click或MouseDoubleClick事件在内部是如何触发/区分的,但从逻辑上讲,应该是时钟参与分析鼠标按下和释放之间的时间间隔。 如果在您按下按钮后代码中有一个断点,则计时器分析将无法识别到Click事件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接