【发布时间】:2010-06-17 07:23:45
【问题描述】:
我想在使用 WPF 创建的页面中隐藏导航栏。我试过ShowsNavigationUI = false,但它仍然显示控件。
【问题讨论】:
标签: wpf xaml uinavigationbar
我想在使用 WPF 创建的页面中隐藏导航栏。我试过ShowsNavigationUI = false,但它仍然显示控件。
【问题讨论】:
标签: wpf xaml uinavigationbar
指定给页面Container,本意不带导航栏,使用
NavigationUIVisibility 属性。
<Frame NavigationUIVisibility="Hidden" Panel.ZIndex="1" ... />
【讨论】:
NavigationUIVisibility="Visible" 可以解决问题。
这是一个非常简单的实现。
<Frame x:Name="_FrameName" NavigationUIVisibility="Hidden" />
【讨论】:
在Page 上设置ShowsNavigationUI=False 应该可以做到。但是,似乎确实存在一个错误,它会导致至少在一个事件序列中失败:
NavigationWindow中可能还有其他我还没有遇到的情况导致它失败。
为了让它完全可靠地工作,我所做的是完全忽略 Page.ShowsNavigationUI 属性并将其设置在 NavigationWindow 上。这似乎是完全可靠的。
这是如何在您的 Page 构造函数中完成的:
Dispatcher.BeginInvoke(ApplicationPriority.Render, new Action(() =>
{
var navWindow = Window.GetWindow(this) as NavigationWindow;
if(navWindow!=null) navWindow.ShowsNavigationUI = false;
}));
如果您这样做,请记住不要在任何 Page 对象上设置 ShowsNavigationUI。
仅供参考,您还可以通过更改其 ControlTemplate 以任何您喜欢的方式重新设置 NavigationWindow 的样式。例如,这会删除除实际页面内容之外的所有内容:
<Style TargetType="{x:Type NavigationWindow}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type NavigationWindow}">
<AdornerDecorator>
<ContentPresenter Name="PART_NavWinCP"
ClipToBounds="true"/>
</AdornerDecorator>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
【讨论】:
NavigationUIVisibility="Hidden"
如果您使用的是 Frame,您可以更改 Frame 的默认样式以移除导航按钮(如下所示)。可以对 NavigationWindow 执行相同的方法。我最初尝试设置 Page.ShowsNavigationUI 并没有效果。只需将以下样式添加到 ResourceDictionary 即可。
<Style TargetType="{x:Type Frame}">
<Setter Property="Control.Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Frame}">
<Border BorderThickness="{TemplateBinding Border.BorderThickness}" Padding="{TemplateBinding Control.Padding}" BorderBrush="{TemplateBinding Border.BorderBrush}" Background="{TemplateBinding Panel.Background}">
<ContentPresenter Content="{TemplateBinding ContentControl.Content}" ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}" ContentStringFormat="{TemplateBinding ContentControl.ContentStringFormat}" Name="PART_FrameCP" />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
【讨论】:
我发现这很容易。在您的 MainWindow 中,执行以下操作:
public MainWindow()
public partial class MainWindow : NavigationWindow
{
public MainWindow()
{
InitializeComponent();
ShowsNavigationUI = false;
}
}
}
如果您在按钮单击以打开新页面时发生事件,只需执行以下操作:
private void btnEndUserSearch_Click(object sender, RoutedEventArgs e)
{
EndUser EndUserSearchPage = new EndUser();
this.NavigationService.Navigate(EndUserSearchPage);
EndUserSearchPage.ShowsNavigationUI = false;
}
【讨论】:
以上仅适用于导航窗口,但我使用的是普通的 WPF 窗口。有人说这些比导航窗口更好。我正在使用 DockPanel 来托管我的页面。我的解决方案为 DockPanel 创建了一个新模板,并且根本不添加按钮或将它们隐藏(请参阅 StackPanel Visibility="Hidden")。效果很好。
<DockPanel>
<Frame x:Name="_mainFrame">
<Frame.Template>
<ControlTemplate TargetType="Frame">
<DockPanel Margin="7">
<StackPanel Visibility="Hidden"
Margin="0"
Orientation="Horizontal"
DockPanel.Dock="Top"
>
<!--<Button
Content="Avast! Go back!"
Command="{x:Static NavigationCommands.BrowseBack}"
IsEnabled="{TemplateBinding CanGoBack}"
/>
<Button
Content="Forward you dogs!"
Command="{x:Static NavigationCommands.BrowseForward}"
IsEnabled="{TemplateBinding CanGoForward}"
/>-->
</StackPanel>
<Border>
<ContentPresenter />
</Border>
</DockPanel>
</ControlTemplate>
</Frame.Template>
</Frame>
</DockPanel>
【讨论】:
最简单最简单的方法之一是添加: ShowsNavigationUI = false; 在 InitializeComponent() 下的 cs 文件构造函数中;
【讨论】:
对于初学者,您可以像这样简单地更改 MainWindow.xaml 中的代码。
<Window>
<Grid >
<Frame x:Name="LeftFrame" NavigationUIVisibility="Hidden"/>
<Frame x:Name="RightFrame" NavigationUIVisibility="Hidden"/>
</Grid>
</Window>
【讨论】:
每当我动态更改 Frame 的 Content 属性时,我都会遇到这个问题,并通过在 click() 事件中使用以下代码解决了这个问题。
ContentFrame.NavigationUIVisibility = NavigationUIVisibility.Hidden;
其中 ContentFrame 是框架的名称,在 XAML 中定义。即
<Frame x:Name="ContentFrame" />
【讨论】:
在 NavigationWindow 本身我使用 ShowsNavigationUI="False"
【讨论】: