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】:好的,我已经找到了解决方案。
我刚刚在上面的代码中添加了一个父级<Popup>
,它按预期工作。现在当子窗口有属性Topmost=true
时也可以使用。
代码现在看起来像:
<Popup
IsOpen="True"
StaysOpen="True"
Placement="Relative"
Grid.Row="1"
>
<!-- // Grid named st_pnl -->
</Popup>
【讨论】:
以上是关于WPF Grid Panel.ZIndex 设置为 1 在另一个窗口的情况下不起作用的主要内容,如果未能解决你的问题,请参考以下文章
WPF 的xaml中,我在制作BUTTON控件的模板中画了一个圆,我怎么样设置这个圆的Width等于控件width的一半?
如何停止 Blend 2.5 June Preview 在 SL1.0 XAML 上用 Panel.ZIndex 替换 Canvas.ZIndex?