假设我在WPF应用程序Window1和Window2中有两个不同的窗口。
基于Window1的一些操作,Window2弹出一段时间,并且还基于Window1中的一些操作,Window2应该关闭并在Window2出现之前查看返回Window1的状态。
使用它的状态我的意思是Window1中存在的所有控件中的所有内容。
实现我使用的切换
的ShowDialog();
我正好看,因为我需要在Window2打开时冻结Window1。
现在我的问题是我无法使用它的内容返回Window1。
MainWindow(Window1).xaml
<Window x:Class="Test.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Button Content="Button" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Margin="193,130,0,0" Click="Button_Click"/>
</Grid></Window>
Button_Click
private void Button_Click(object sender, RoutedEventArgs e)
{
Window1 window1 = new Window1();
window1.ShowDialog();
//Actions
window1.Close();
}
和Window1 xaml是一个正常的我没有改变任何东西,除了我做了
WindowStyle =无
因此我无法使用右上方退出按钮退出
答案 0 :(得分:2)
如果您使用的是MVVM,可以使用:
public static class DialogCloser
{
public static readonly DependencyProperty DialogResultProperty =
DependencyProperty.RegisterAttached(
"DialogResult",
typeof(bool?),
typeof(DialogCloser),
new PropertyMetadata(DialogResultChanged));
private static void DialogResultChanged(
DependencyObject d,
DependencyPropertyChangedEventArgs e)
{
var window = d as Window;
if (window != null)
window.DialogResult = e.NewValue as bool?;
}
public static void SetDialogResult(Window target, bool? value)
{
target.SetValue(DialogResultProperty, value);
}
}
在XAML中:
<Window x:Class="Window2"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/
xmlns:xc="clr-namespace:Window2"
xc:DialogCloser.DialogResult="{Binding DialogResult}"
然后在模型中你可以使用:
public bool? DialogResult
{
get;
set;
}
答案 1 :(得分:2)
您的问题和业务逻辑有点不清楚,因此答案基于合格的猜测:为了在对话模式下打开第二个WPF窗口(window2),请使用以下通用代码:
Window2 _window2 = new Window2()
{
Title = "Modal Dialog Window",
Topmost = true,
ResizeMode = ResizeMode.NoResize,
ShowInTaskbar = false,
Owner = this
};
_window2.ShowDialog();
要关闭第二个window2
,请使用标准&#34;关闭&#34;右上方控制框中的按钮,或将Button
添加到window2
并将this.Close()
语句添加到该按钮Click
事件中。
根据您的其他评论进行编辑:如果您将第二个窗口显示为模态对话框,那么您将阻止所有者窗口(例如弹出MessageBox)。请澄清您的业务逻辑,因为您不清楚为什么需要打开第二个窗口然后从主窗口关闭它。什么样的&#34;行动&#34;你在主窗口的按钮点击事件中打开和关闭第二个窗口之间?您可以考虑在正常模式下打开第二个窗口,然后可以使用例如第一个窗口上放置的某个Button控件从主窗口关闭它。看来你必须改进业务逻辑。
希望这可能会有所帮助。
答案 2 :(得分:1)
这是我常用的东西:
Dim TheAboutWindow As New winAbout
TheAboutWindow.Owner = Me
TheAboutWindow.ShowDialog()
TheAboutWindow = Nothing
当我不想一遍又一遍地加载东西时,我有时会使用My.Windows.winName,但你需要取消关闭并以某种方式隐藏窗口。
但My.Windows.winName有一个很棒的事情,你不需要记住变量名,它通常可以在任何打开的窗口中访问。 (不确定当两个实例打开时如何工作。)
这意味着你可以做My.Windows.winMain.Title =&#34; OMG Jawj。你看到了吗?&#34;
My.Windows.winHost.Owner = Me
My.Windows.winHost.ShowDialog()
如果您想要从孩子那里执行最小化功能并在max / normal上再次显示孩子,您可以/应该省略所有者行。
答案 3 :(得分:1)
这个话题太老了,但是也许这就是你在说什么?
// Currently in Window1, want to open window2 and make window1 not visible
private void Change_Click(object sender, RoutedEventArgs e)
{
Window2 mainWindow = new Window2();
Visibility = Visibility.Hidden;
Window2.Show();
}