C# 如何在TabItem更改前使Tabcontrol弹出消息
当我在更改TabItem时使用TabControl的Selectionchanged事件时,我会选择 我是这样做的: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
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);