以正确的顺序从另一个窗口打开和关闭 2 个窗口

问题描述 投票:0回答:1

我有一个 WPF 应用程序。它有 3 个窗口,我需要按正确的顺序打开和关闭:工作窗口、请求窗口和用户信使窗口,为了简单起见,我们将它们命名为 Window1、Window2、Window3。 Window2 有一个消息按钮,可打开 Window3。但 Window1 中还有另一个按钮,可以同时打开 Window2 和 Window3。 我到底想实现什么:

  1. 单击 Window1 中的按钮
  2. Window2 和 Window3 打开,z 索引如下:Window1 - 1;窗口2 - 2;窗口3 - 3
  3. 当 Window3 打开时,无法在其他窗口中执行任何操作(ShowDialog() 的工作原理),与 Window2 相同(假设 Window3 关闭)
  4. 每当窗口关闭时,它们都会保留 z 索引

我尝试过的: 我的初始代码:

                var rw = new RequestWindow(Request, false);
                var umw = new UserMessengerWindow(Request);
                rw.Show();
                umw.Topmost = true;
                umw.ShowDialog();

实际发生的情况:它打开这些窗口,但是每当 Window3 关闭时,Window2 就会转到后面(在 Window1 后面)。 我尝试设置所有者属性:

                var rw = new RequestWindow(Request, false);
                var umw = new UserMessengerWindow(Request);
                rw.Owner = Application.Current.Windows.OfType<WorkerWindow>().FirstOrDefault();
                rw.Show();
                umw.Topmost = true;
                umw.ShowDialog();

现在,每当 Window3 关闭时,Window1 和 Window2 都会保留其原始 z 索引,但焦点会转到 Window1(并且它是可交互的,而我希望它不是),在 Window2 上使用 Focus() 或 Activate() 则不会帮助。

c# wpf showdialog
1个回答
0
投票

如果我正确理解你需要什么:

<Window x:Class="Core2024.SO.JamalShakhmurzaev.Window1"
        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/2006"
        xmlns:local="clr-namespace:Core2024.SO.JamalShakhmurzaev"
        mc:Ignorable="d"
        Title="Window1" Height="450" Width="800">
    <UniformGrid Columns="1" Background="Yellow">
        <Viewbox>
            <TextBlock Text="First" Margin="5"/>
        </Viewbox>
        <Viewbox>
            <Button Content="Open Second Window" Margin="5" Padding="15 5"
                    Click="OnOpenSecondWindow"/>
        </Viewbox>
         <Viewbox>
            <Button Content="Open Third Window" Margin="5" Padding="15 5"
                    Click="OnOpenThirdWindow"/>
        </Viewbox>
   </UniformGrid>
    <x:Code>
        <![CDATA[
        private void OnOpenSecondWindow(object sender, RoutedEventArgs e)
        {
            Window2 window2 = new Window2();
            window2.Owner = this;
            window2.ShowDialog();
        }

        private void OnOpenThirdWindow(object sender, RoutedEventArgs e)
        {
            Window2 window2 = new Window2();
            window2.Owner = this;
            window2.Loaded += delegate
            {
                Window3 window3 = new Window3();
                window3.Owner = window2;
                window3.ShowDialog();
            };
            window2.ShowDialog();
        }
        ]]>
    </x:Code>
</Window>
<Window x:Class="Core2024.SO.JamalShakhmurzaev.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/2006"
        xmlns:local="clr-namespace:Core2024.SO.JamalShakhmurzaev"
        mc:Ignorable="d"
        Title="Window2" Height="450" Width="800">
    <UniformGrid Columns="1" Background="LightGreen">
        <Viewbox>
            <TextBlock Text="Second" Margin="5"/>
        </Viewbox>
        <Viewbox>
            <Button Content="Open Third Window" Margin="5" Padding="15 5"
                    Click="OnOpenThirdWindow"/>
        </Viewbox>
    </UniformGrid>
    <x:Code>
        <![CDATA[
        private void OnOpenThirdWindow(object sender, RoutedEventArgs e)
        {
            Window3 window3 = new Window3();
            window3.Owner = this;
            window3.ShowDialog();
        }
        ]]>
    </x:Code>
</Window>
© www.soinside.com 2019 - 2024. All rights reserved.