0

我有以下 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>

...使用以下代码来处理附加事件。

namespace SimpleAttahEvent
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {

        public MainWindow()
        {
            InitializeComponent();
            stackButton.AddHandler(Button.ClickEvent, new RoutedEventHandler(DoSomething));
        }

        private void DoSomething(object sender, RoutedEventArgs e)
        {
            Console.WriteLine(Button.ClickEvent.RoutingStrategy);
            Console.WriteLine(TextBox.PreviewKeyDownEvent.RoutingStrategy);
            if (e.Source == cmd1)
            {
                MessageBox.Show("First button is clicked");
            }
            if (e.Source == cmd2)
            {
                MessageBox.Show("Second button is clicked");
            }
            if (e.Source == cmd3)
            {
                MessageBox.Show("Third button is clicked");
            }


        }
    }
}

这些会产生一个带有 3 个垂直堆叠的按钮的对话框。当我单击其中一个按钮时,会出现一个带有确定按钮的消息框。但是,除非我单击两次,否则对话框上的 OK 按钮不会关闭。我是否从上面给出的代码中隐式执行此操作?

编辑 - 附加信息:

当我这样做时

private void DoSomething(object sender, RoutedEventArgs e)
        {
            object tag = ((FrameworkElement)sender).Tag;
            MessageBox.Show((string)tag);

        }

..它仍然需要单击 2 次才能关闭消息框。

4

1 回答 1

3

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

我第一眼就错过了这一行:

stackButton.AddHandler(Button.ClickEvent, new RoutedEventHandler(DoSomething));

这与ButtonBase.Click这条线的相同

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

选择一种附加到事件处理程序的方法并坚持下去。把它们混在一起只会造成混乱。

于 2013-02-15T20:40:45.140 回答