C# 如何在TabItem更改前使Tabcontrol弹出消息

C# 如何在TabItem更改前使Tabcontrol弹出消息,c#,silverlight,tabcontrol,tabitem,selectionchanged,C#,Silverlight,Tabcontrol,Tabitem,Selectionchanged,当我在更改TabItem时使用TabControl的Selectionchanged事件时,我会选择 我是这样做的: tabcntrl.SelectionChanged += new SelectionChangedEventHandler( obj.TabControl_SelectionChanged); public void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e) { Mess

当我在更改TabItem时使用TabControl的Selectionchanged事件时,我会选择

我是这样做的:

tabcntrl.SelectionChanged += new SelectionChangedEventHandler( obj.TabControl_SelectionChanged);
public void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    MessageBox.Show("check1");
}
我想要的是,当我单击要更改的选项卡时,在打开选项卡之前,它应该打印这个消息框,并且“它与我编写的代码配合得很好”。 但是当我把这个代码改成这样的时候:(这是我用childwindow制作的coustom按钮)

此代码首先显示更改选项卡的步骤 :切换到另一个选项卡,然后弹出此消息框,而在以前的代码中,它首先弹出meassgebox,然后切换到另一个 我想要的是让第二个代码像第一个一样工作

我的意思是,它应该首先弹出第二个代码的messagebox,然后切换到另一个选项卡,而不是之前(这是因为此弹出窗口将再次决定是否保存当前选项卡的数据,然后再转到下一个选项卡)


问题是ChildWindow.Show()似乎是半模态的,这意味着它会立即返回,但是当窗口实际打开时,它的行为就像模态窗口一样-即背景中的所有内容都会变暗。 要解决此问题,您必须订阅ChildWindow的Closed事件,并仅在触发此事件时执行自定义操作

在这里,让我向您展示如何做到这一点:

private void Button_Click(object sender, RoutedEventArgs e)
{
    ChildWindow w = new ChildWindow();
    ShowChildWindowAndPerformAction(w,
        () =>
        {
            //put your custom code here that needs to be run when the window is closed
            int i = 5;
        });
}

public void ShowChildWindowAndPerformAction(ChildWindow w, Action action)
{
    EventHandler handler = null;
    handler = (sender2, args2) =>
    {
        w.Closed -= handler;

        action();
    };

    w.Closed += handler;

    w.Show();
}

也许您可以尝试以异步方式以低线程优先级显示messagebox

Dispatcher.InvokeAsync(()=>MessageBox.Show("Test"), DispatcherPriority.Background);

谢谢你的回答。您知道我的目的是在更改选项卡时,单击下一个选项卡时,它必须弹出消息框,以确定是否要保存当前数据(将控件保留在当前选项卡中)。当我单击“是”,然后保存它,否则切换到下一个选项卡。@Tanish我做了同样的操作,但它仍然做同样的操作。当我单击另一个选项卡时,它首先切换到该选项卡,然后弹出窗口。不幸的是,TabControl不公开可取消的事件,如SelectionChange,因此您必须以艰难的方式执行此操作,请参阅。@Tanish谢谢,但您能更详细地解释一下吗?我无法理解Yetun幸运的是,TabControl没有公开SelectionChange之类的可取消事件,因此您必须以艰难的方式完成此操作,请参阅另一个stackoverflow问题。
private void Button_Click(object sender, RoutedEventArgs e)
{
    ChildWindow w = new ChildWindow();
    ShowChildWindowAndPerformAction(w,
        () =>
        {
            //put your custom code here that needs to be run when the window is closed
            int i = 5;
        });
}

public void ShowChildWindowAndPerformAction(ChildWindow w, Action action)
{
    EventHandler handler = null;
    handler = (sender2, args2) =>
    {
        w.Closed -= handler;

        action();
    };

    w.Closed += handler;

    w.Show();
}
Dispatcher.InvokeAsync(()=>MessageBox.Show("Test"), DispatcherPriority.Background);