我在一个情况下,我使用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 ?
问题是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();
}
也许你可以尝试用低线程优先级的异步方式来显示消息框。
Dispatcher.InvokeAsync(()=>MessageBox.Show("Test"), DispatcherPriority.Background);