如何让Tabcontrol在TabItem改变前弹出一条信息?

问题描述 投票:1回答:2

我在一个情况下,我使用TabControl的Selectionchanged事件来改变TabItem。

我做的事情是这样的。

tabcntrl.SelectionChanged += new SelectionChangedEventHandler( obj.TabControl_SelectionChanged);
public void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    MessageBox.Show("check1");
}

我想要的是,当我点击要改变的标签时,在打开标签之前,它应该打印这个消息框和 "它做得很好,与我写的代码".但是,当我改变这个代码到这个。(这是我用childwindow做的自定义按钮)

tabcntrl.SelectionChanged += new SelectionChangedEventHandler( obj.TabControl_SelectionChanged);
 public void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
           string msg = "Tab Changed :Save data of MetaviewModel ?";
           CoustomButtonMessage cusButton = new CoustomButtonMessage("Error", msg, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Error);
           cusButton.Show();
        }

这段代码在改变标签时,首先:切换到另一个标签,然后弹出这个消息框,而在以前的代码中,它是先弹出meassgebox,然后切换到另一个标签.而我想要的是让第二段代码像第一段代码一样工作,我的意思是它应该首先弹出第二段代码的消息框,然后它应该切换到另一个标签,而不是之前。

我的意思是,它应该先弹出第二个代码的消息框,然后它应该切换到另一个标签,而不是之前。(因为这个弹出的对话框会再次决定是否保存当前标签页的数据,然后再转到下一个标签页)

How to acheieve this ?
c# silverlight tabcontrol tabitem selectionchanged
2个回答
1
投票

问题是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();
}

0
投票

也许你可以尝试用低线程优先级的异步方式来显示消息框。

Dispatcher.InvokeAsync(()=>MessageBox.Show("Test"), DispatcherPriority.Background);
© www.soinside.com 2019 - 2024. All rights reserved.