【问题标题】:Wpf not all windows are maximized from taskbarWpf 并非所有窗口都从任务栏最大化
【发布时间】:2014-08-22 06:27:36
【问题描述】:

我有三个窗口。 FirstWindowSecondWindowThirdWindowFirstWindow 有按钮,单击此按钮会打开SecondWindow。类似地,SecondWindow 有按钮,单击此按钮会打开ThirdWindowSecondWindowOwner 属性设置为FirstWindowThirdWindowOwner 属性设置为SecondWindow。场景描述问题:

连续打开所有窗口。它看起来像这样:

然后点击ThirdWindow右上角的相应图标最小化所有窗口。 如果您尝试通过单击任务栏中的FirstLevelWindowThirdLevelWinow 来最大化所有窗口 - 一切都会好的,三个窗口将被最大化。但是如果你点击SecondWindow你会看到这个:

我该如何修复它,或者它只是 WPF 错误?如果有帮助,我可以提供存档的示例项目。

更新

最小化窗口 - 点击“_”图标,窗口图标栏中的左侧图标。所有窗口都是模态的,即它使用ShowDialog() 方法打开,而不是Show() 方法打开。因此,如果您最小化第三个窗口 - 所有窗口都将被最小化。

这里如果你不想通过链接下载项目的代码:

FirstWindowXAML:

<Button Click="OpenChildWindow" 
        Content="ChildWindow"/>

FirstWindow.cs:

private void OpenChildWindow(Object sender, RoutedEventArgs e)
{
    var window = new SecondLevelWindow();
    window.Owner = this;
    window.ShowDialog();
}

SecondWindowXAML:

<Button Click="OpenChildWindow" 
        Content="ChildWindow"/>

SecondWindow.cs:

private void OpenChildWindow(Object sender, RoutedEventArgs e)
{
    var window = new ThirdLevelWindow();
    window.Owner = this;
    window.ShowDialog();
}

ThirdWindow 是没有任何内容的空窗口。

这里 link 示例项目

我刚刚发现,如果 ThirdWindow 的属性 ResizeMode 设置为“NoResize”,则不会重现该错误。 Mb 这将是有用的信息。

【问题讨论】:

  • “然后通过点击ThirdWindow右上角的相应图标最小化所有窗口”是什么意思?如果你这样做,我希望只有第三个窗口被最小化。另外,您如何将它们显示为模态或非模态?
  • @Adrian Faciu,请参阅更新
  • 无法在 Windows 8 上重现此问题,如果我最小化第三个窗口,其他两个窗口都不会受到影响。
  • @Adrian Faciu,“其他两个都没有受到影响”是什么意思?只有第三个窗口最小化? O_o。如果您有兴趣,我可以提供示例项目。
  • @monstr,我认为 其他两个都不受影响 是不言自明的。这意味着第三个Window被最小化了,而另外两个没有。

标签: wpf window owner


【解决方案1】:

好吧,我承认我不知道发生了什么。您是否尝试添加第四个窗口?这变得更奇怪了:第二个窗口带回了第三个窗口,但第四个窗口仍然没有回来。

无论如何,如果我必须解决这个问题,我会在每个父窗口中保留我的 childWindow 的引用。这样,在任何有趣的事件上(例如在您的示例中的第二个窗口上激活)我都可以根据需要管理我孩子的状态(在您的情况下为WindowState.Normal)。

可能是这样的:在 secondWindow 的 xaml 中:

Activated="SecondLevelWindow_OnActivated"

然后在后面的代码中:

        private ThirdLevelWindow _window;

        public SecondLevelWindow()
        {
            InitializeComponent();
        }

        private void OpenChildWindow(Object sender, RoutedEventArgs e)
        {
            _window = new ThirdLevelWindow ();
            _window.Owner = this;
            _window.ShowDialog();
        }

        public void SecondLevelWindow_OnActivated(object sender, EventArgs e)
        {
            if (_window != null)
            {
                _window.WindowState = WindowState.Normal;
            }
        }

这是一个开始,但您也可以检查您当前的状态来定义您孩子的状态。

希望对你有帮助。

【讨论】:

  • 是的,我尝试添加第四个窗口并观察到相同的行为。第四个窗口未最大化。因此,窗口链中的最后一个窗口并不总是最大化。你的方法奏效了。但我认为在 MVVM(例如)中,在父窗口的 ViewModel 中保存指向子窗口的链接并不是一个好主意。
  • 好吧,因为它是纯粹的 UI 责任,我会在我的 MVVM 项目中找到可以接受的这种解决方案。我仍然同意这不是一个完美的解决方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-29
  • 2012-09-30
相关资源
最近更新 更多