XAML WPF按钮单击事件不工作

2eafrhcq  于 2023-04-27  发布在  其他
关注(0)|答案(4)|浏览(150)

我有一个按钮,其中包含一个图像内的网格,我的问题是,我不能使按钮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问题中看到了一个解决方案,但它不起作用。

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

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

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

svgewumm

svgewumm1#

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

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

另外,REMOVE您的事件处理过程:

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

sqyvllje

sqyvllje2#

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

qmelpv7a

qmelpv7a3#

尝试使用Tap事件而不使用click事件。两个事件中的功能相同,

56lgkhnf

56lgkhnf4#

按钮的Click事件正在工作。删除代码中可能在单击和按钮的OnClick之间触发的断点方法。(例如OnPreviewMouseDown,等等)我不知道Click或MouseDoubleClick事件在内部是如何触发/区分的,但逻辑上应该是分析鼠标按下和鼠标抬起间隔之间的时间所涉及的时钟。如果按钮上的代码中存在断点,则计时器分析无法识别Click事件。

相关问题