2010-06-17 12 views

Antwort

16

Einstellung ShowsNavigationUI = false auf einem Page-Objekt sollte es tun. Es scheint ein Fehler zu sein, aber, dass dies in mindestens einer Folge von Ereignissen scheitern verursacht:

  1. Seite ist bereits in Navigation Einstellung, wenn
  2. Seite navigiert weg und wieder zurück

Es kann andere Szenarien geben, in denen ich noch nicht gelandet bin, die es scheitern lassen.

Damit dies absolut zuverlässig funktioniert, ignoriere ich die Page.ShowsNavigationUI -Eigenschaft vollständig und setze sie stattdessen auf NavigationWindow. Dies scheint absolut zuverlässig zu sein.

Hier ist, wie dies in Ihrer Seite Konstruktor erfolgen:

Dispatcher.BeginInvoke(ApplicationPriority.Render, new Action(() => 
{ 
    var navWindow = Window.GetWindow(this) as NavigationWindow; 
    if(navWindow!=null) navWindow.ShowsNavigationUI = false; 
})); 

Wenn Sie dies tun, denken Sie daran nicht ShowsNavigationUI auf jeder Seite Objekt einzustellen.

Zu Ihrer Information, Sie können Ihr Navigationsfenster auch anders gestalten, indem Sie das ControlTemplate ändern. Zum Beispiel entfernt das alles außer dem eigentlichen Seiteninhalt:

<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> 
+0

Ich kann nicht ApplicationPriority finden. In welcher Klasse ist es? Ich habe das gleiche Problem, aber für mich ist es zufällig. – Paparazzi

+0

Ändern Sie den 'ApplicationPriority.Render' durch 'DispatcherPriority.Loaded' –

3

Oben funktioniert nur für Navigationsfenster, aber ich benutze gewöhnliche WPF-Fenster. Einige sagen, diese sind besser als Navigationsfenster. Ich verwende DockPanel, um meine Seiten zu hosten. Meine Lösung erstellt eine neue Vorlage für das DockPanel und fügt einfach keine Schaltflächen hinzu oder macht sie unsichtbar (siehe StackPanel Visibility = "Versteckt"). Es funktioniert gut.

<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> 
+0

ermöglicht dies Ihnen, Seiten dynamisch zu laden und zu schließen, während Ihre Hauptseite geöffnet bleibt? –

5

Diese fand ich wirklich einfach. In Ihrem Mainwindow, dies zu tun:

public MainWindow() 
    public partial class MainWindow : NavigationWindow 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 

      ShowsNavigationUI = false; 
     } 
    } 
} 

Und wenn Sie ein Ereignis auf die Schaltfläche haben, um eine neue Seite zu öffnen, tun gerade dies:

private void btnEndUserSearch_Click(object sender, RoutedEventArgs e) 
{ 
      EndUser EndUserSearchPage = new EndUser(); 
      this.NavigationService.Navigate(EndUserSearchPage); 
      EndUserSearchPage.ShowsNavigationUI = false; 
} 
+0

+1 für Klarheit. – jogojapan

7

Wenn Sie einen Rahmen verwenden Sie kann den Standard-Stil des Rahmens ändern, um die Navigationsschaltflächen zu entfernen (siehe unten). Der gleiche Ansatz könnte für NavigationWindow durchgeführt werden. Ich habe ursprünglich versucht, PageShowsNavigationUI zu setzen, und es hatte keine Wirkung. Fügen Sie einfach den folgenden Stil zu einem ResourceDictionary hinzu und es funktioniert gut.

<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> 
68

nur in Ihre Seite Container sagen, Sie Navigationsleiste wollen oder nicht, NavigationUIVisibility Eigenschaft.

<Frame Margin="173,41,1,28" Name="frmPageContainer" NavigationUIVisibility="Hidden" Panel.ZIndex="1" > 

0

Ich hatte dieses Problem, wenn ich dynamisch die Content-Eigenschaft eines Rahmens geändert, und löste es, indem Sie den folgenden Code in meinem Klick() Ereignis verwendet wird.

ContentFrame.NavigationUIVisibility = NavigationUIVisibility.Hidden; 

Dabei ist ContentFrame der Name des Frames, wie in XAML definiert. d.h.

<Frame x:Name="ContentFrame" /> 
22

Es ist eine sehr einfache Implementierung.

hier:

<Frame x:Name="_FrameName" NavigationUIVisibility="Hidden" /> 

:-P

Verwandte Themen