C# WPF中的附加事件:确定按钮始终需要单击两次才能关闭

C# WPF中的附加事件:确定按钮始终需要单击两次才能关闭,c#,.net,wpf,wpf-controls,C#,.net,Wpf,Wpf Controls,我有以下XAML <Window x:Class="SimpleAttahEvent.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow"> <Grid>

我有以下XAML

<Window x:Class="SimpleAttahEvent.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow">
    <Grid>
        <StackPanel  Margin="5"  Name="stackButton" ButtonBase.Click="DoSomething">
            <Button Name="cmd1" Tag="The first button"> Command 1</Button>
            <Button Name="cmd2" Tag="The second button"> Command 2</Button>
            <Button Name="cmd3" Tag="The third button"> Command 3</Button>

        </StackPanel>
    </Grid>
</Window>

…仍然需要单击两下才能关闭消息框。

您的问题是处理程序加倍。您不必在同一个
OK
上单击两次;您正在单击OK,这将关闭第一条消息。然后,再次处理该事件,您会收到另一条完全相同的消息,您必须单击“确定”。如果将
+DateTime.Now
添加到消息中,您将看到这确实是第二条消息

我第一眼就漏掉了这句话:

stackButton.AddHandler(Button.ClickEvent, new RoutedEventHandler(DoSomething));
这与
按钮库相同。从此行单击

<StackPanel  Margin="5"  Name="stackButton" ButtonBase.Click="DoSomething">


选择一种方式附加到事件处理程序并坚持使用它。把它们混在一起只会引起混乱。

你的问题是你的处理程序加倍了。您不必在同一个
OK
上单击两次;您正在单击OK,这将关闭第一条消息。然后,再次处理该事件,您会收到另一条完全相同的消息,您必须单击“确定”。如果将
+DateTime.Now
添加到消息中,您将看到这确实是第二条消息

我第一眼就漏掉了这句话:

stackButton.AddHandler(Button.ClickEvent, new RoutedEventHandler(DoSomething));
这与
按钮库相同。从此行单击

<StackPanel  Margin="5"  Name="stackButton" ButtonBase.Click="DoSomething">


选择一种方式附加到事件处理程序并坚持使用它。把它们混在一起只会引起混乱。

这对我很有效。有没有其他可能与此功能交互的代码?我只有这些。我想不出还有什么东西可以与此功能交互。在没有路由事件处理程序的情况下试试如何?只需将每个按钮中的点击处理程序定义为一个测试。这对我来说很有用。有没有其他可能与此功能交互的代码?我只有这些。我想不出还有什么东西可以与此功能交互。在没有路由事件处理程序的情况下试试如何?只需将每个按钮中的单击处理程序定义为测试。