我正在使用ShowDialog()
和WindowStyle = WindowStyle.SingleBorderWindow;
在我的WPF(MVVM)应用程序中打开一个模态窗口,但它允许我通过Windows任务栏导航到父窗口(Windows 7)。
我在这里找到了一个答案:WPF和ShowDialog(),但它对我来说不太适用,因为我不需要一个"始终置顶"的工具窗口。
提前致谢
我正在使用ShowDialog()
和WindowStyle = WindowStyle.SingleBorderWindow;
在我的WPF(MVVM)应用程序中打开一个模态窗口,但它允许我通过Windows任务栏导航到父窗口(Windows 7)。
我在这里找到了一个答案:WPF和ShowDialog(),但它对我来说不太适用,因为我不需要一个"始终置顶"的工具窗口。
提前致谢
尝试设置对话框的Owner
属性。那应该可以工作。
Window dialog = new Window();
dialog.Owner = mainWindow;
dialog.ShowDialog();
编辑: 我在使用MVVM时遇到了一个类似的问题。您可以通过使用委托来解决这个问题。
public class MainWindowViewModel
{
public delegate void ShowDialogDelegate(string message);
public ShowDialogDelegate ShowDialogCallback;
public void Action()
{
// here you want to show the dialog
ShowDialogDelegate callback = ShowDialogCallback;
if(callback != null)
{
callback("Message");
}
}
}
public class MainWindow
{
public MainWindow()
{
// initialize the ViewModel
MainWindowViewModel viewModel = new MainWindowViewModel();
viewModel.ShowDialogCallback += ShowDialog;
DataContext = viewModel;
}
private void ShowDialog(string message)
{
// show the dialog
}
}
我遇到了这个问题,但是由于窗口是从视图模型中打开的,我没有当前窗口的引用。要解决这个问题,我使用了以下代码:
var myWindow = new MyWindowType();
myWindow.Owner = Application.Current.Windows.OfType<Window>().SingleOrDefault(x => x.IsActive);
myWindow.Owner = Application.Current.MainWindow;
然而,如果你同时打开了三个窗口,这种方法可能会出现问题。MainWindow
|
-----> ChildWindow1
|
-----> ChildWindow2
然后将ChildWindow2.Owner = Application.Current.MainWindow设置为窗口的所有者,使其所有者成为其祖父窗口,而不是父窗口。
当父窗口创建(并显示)子窗口时,您需要设置所有者。
public partial class MainWindow : Window
{
private void openChild()
{
ChildWindow child = new ChildWindow ();
child.Owner = this; // "this" is the parent
child.ShowDialog();
}
}
<Window x:Class="ChildWindow"
ShowInTaskbar="False" >
</Window>
ShowInTaskbar = false;
这可能发生在InitializeComponent();
之后。
这与Xcalibur37的答案相同,但我认为,由于WPF强制你拥有一个.cs
文件和一个.xaml
文件,因此你可以将不太可能更改的东西放在.cs
文件中。
f2.Owner = Window.GetWindow(this);
f2.ShowDialog();
就是这样,我保证它不会消失!
希望有所帮助, Guy
App.Current.MainWindow
,它可以工作,但不是最好的解决方案。也许我应该重新考虑我的MVVM模式结构。 - OszkarApplication.Current.MainWindow
(使用 Application 而不是 App),由于它是静态的,所以没有影响 MVVM,一切都很顺利。 - heltonbiker