WPF Grid Panel.ZIndex 设置为 1 在另一个窗口的情况下不起作用

Posted

技术标签:

【中文标题】WPF Grid Panel.ZIndex 设置为 1 在另一个窗口的情况下不起作用【英文标题】:WPF Grid Panel.ZIndex set to 1 is not working in case of another window 【发布时间】:2021-10-12 02:43:23 【问题描述】:

我正在 WPF 中构建一个应用程序,我想显示一个导航堆栈面板,使其始终显示在每个其他子窗口的顶部,就像菜单栏的功能一样。

我的 MainWindow.xaml 在网格中有此代码。

<!--// Navigation Panel //-->

<Grid
    x:Name="nav_pnl"
    HorizontalAlignment="Left"
    Width="65"
    Background="#2E333A"
    Panel.ZIndex="1"
    >

    <StackPanel
        x:Name="st_pnl"
        >

        <Grid
            Background="#FF225277"
            Height="100"
            >

            <TextBlock
                Grid.Row="1"
                Grid.Column="0"
                Margin="73,-20,0,0"
                Text="COMPANY"
                Foreground="White"
                FontSize="22"
                Background="Transparent"
                HorizontalAlignment="Left"
                VerticalAlignment="Center"
                Style="StaticResource styl_tb_font1"
                >

            </TextBlock>

            <ToggleButton 
                x:Name="Tg_Btn"
                Grid.Column="0"
                VerticalAlignment="Center"
                HorizontalAlignment="Left"
                Margin="18,-20,0,0"
                Height="30"
                Width="30"
                >

                <ToggleButton.Background>

                    <ImageBrush
                        ImageSource="Assets/tgBtn_default.png"
                        Stretch="None"
                    />

                </ToggleButton.Background>


            </ToggleButton>

        </Grid>

        <!--// ListView with menu list items //-->

        <ListView
            x:Name="LV"
            Background="Transparent"
            BorderBrush="Transparent"
            ScrollViewer.HorizontalScrollBarVisibility="Disabled"
            >

            <ListViewItem
                HorizontalAlignment="Left"
                Margin="0,0,0,15"
                PreviewMouseLeftButtonUp="Dashboard__Click"
                IsSelected="True"
                >

                <StackPanel
                    Orientation="Horizontal"
                    Width="230"
                    >

                    <Image
                        Source="Assets/ico_dashbrd.ico"
                        Stretch="Fill"
                        Width="30"
                        Height="30"
                        Margin="12,0,0,0"
                    />

                    <TextBlock
                        Text="Dashboard"
                        Margin="25,0,0,0"
                        Style="StaticResource styl_tb_font1"
                    />

                </StackPanel>

            </ListViewItem>

            <ListViewItem
                HorizontalAlignment="Left"
                Margin="0,0,0,15"
                >

                <StackPanel
                    Orientation="Horizontal"
                    Width="230"
                    >

                    <Image
                        Source="Assets/icon2.ico"
                        Stretch="Fill"
                        Width="30"
                        Height="30"
                        Margin="12,0,0,0"
                    />

                    <TextBlock
                        Text="Preference"
                        Margin="25,0,0,0"
                        Style="StaticResource styl_tb_font1"
                    />

                </StackPanel>

            </ListViewItem>

            <ListViewItem
                HorizontalAlignment="Left"
                Margin="0,0,0,15"
                >

                <StackPanel
                    Orientation="Horizontal"
                    Width="230"
                    >

                    <Image
                        Source="Assets/icon3.ico"
                        Stretch="Fill"
                        Width="30"
                        Height="30"
                        Margin="12,0,0,0"
                    />

                    <TextBlock
                        Text="Sign Out"
                        Margin="25,0,0,0"
                        Style="StaticResource styl_tb_font1"
                    />

                </StackPanel>

            </ListViewItem>

    </StackPanel>

</Grid>

单击仪表板会打开一个单独的窗口。 这是cs代码:

private void Dashboard__Click(object sender, MouseButtonEventArgs e)

    Window1 wndw1 = new Window1();
    wndw1.Owner = this;
    wndw1.Show();

这里的问题显示在屏幕截图中。

在面板上导​​航时,它必须出现在所有子窗口的最顶部,以便轻松切换到另一个窗口(就像菜单栏一样)。我怎样才能做到这一点?

【问题讨论】:

您是在谈论窗口顶行的菜单栏吗?因为当您说“在所有其他窗口的顶部”时,它听起来好像您在谈论 Z 顺序。 (即完全覆盖所有内容。) 您需要使用 ControlTemplate 将其分配给每个窗口。还要查看 MvvM,所有这些名字都只是尖叫内存泄漏。 @Joe 是的,我说的是类似于菜单栏的行为。正如您提到的 Z 顺序,据我所知,它仅适用于窗口范围(不适用于其他窗口)。 @XAMlMAX 没有得到。能详细点吗? 【参考方案1】:

好的,我已经找到了解决方案。

我刚刚在上面的代码中添加了一个父级&lt;Popup&gt;,它按预期工作。现在当子窗口有属性Topmost=true时也可以使用。

代码现在看起来像:

<Popup
  IsOpen="True"
  StaysOpen="True"
  Placement="Relative"
  Grid.Row="1"
  >

  <!-- // Grid named st_pnl -->

</Popup>

【讨论】:

以上是关于WPF Grid Panel.ZIndex 设置为 1 在另一个窗口的情况下不起作用的主要内容,如果未能解决你的问题,请参考以下文章

WPF - 如何使用绑定创建菜单和子菜单

WPF ListBox 中使用网格布局

WPF 的xaml中,我在制作BUTTON控件的模板中画了一个圆,我怎么样设置这个圆的Width等于控件width的一半?

如何停止 Blend 2.5 June Preview 在 SL1.0 XAML 上用 Panel.ZIndex 替换 Canvas.ZIndex?

[WPF]关于Grid

wpf 界面中放了listbox想让他在最上层显示出来。