Mit Hilfe einer Taste auf eine andere Seite in einem Navigation zu navigieren
-
03-07-2019 - |
Frage
Ich versuche, den Navigationsbefehl Rahmen in WPF zu verwenden, um zwischen Seiten in einer WPF-Anwendung (Desktop, nicht XBAP oder Silverlight) zu navigieren.
Ich glaube, ich habe alles richtig konfiguriert, aber es funktioniert nicht. Ich baue und laufen ohne Fehler, ich bin keine verbindlichen Fehler im Ausgabefenster bekommen, aber meine Navigationstaste ist deaktiviert.
Hier ist die app.xaml für eine Beispielanwendung:
<Application x:Class="Navigation.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="First.xaml">
</Application>
Beachten Sie die StartupUri Punkte First.xaml. First.xaml ist eine Seite. WPF-Hosts automatisch meine Seite in einem Navigation. Hier ist First.xaml:
<Page x:Class="Navigation.First"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="First">
<Grid>
<Button
CommandParameter="/Second.xaml"
CommandTarget="{Binding RelativeSource=
{RelativeSource
FindAncestor,
AncestorType={x:Type NavigationWindow}}}"
Command="NavigationCommands.GoToPage"
Content="Go!"/>
</Grid>
</Page>
Die Command der Taste wird auf die Navigation gesetzt. Der Befehl ist GotoPage, und die Seite ist /Second.xaml. Ich habe versucht, die Command auf die beinhaltende Seite einstellen, die Commandparameter auf „Second.xaml“ (First.xaml und Second.xaml ist sowohl in der Wurzel der Lösung), und ich habe versucht, die Command leer zu verlassen. Ich habe auch versucht, den Pfad zu der Bindung an verschiedene Navigationsbezogenen öffentliche Eigenschaften auf dem Navigation Einstellung. Nichts hat bisher funktioniert.
Was bin ich hier? I wirklich will nicht meine Navigation im Code tun.
Klarstellung.
Wenn stattdessen eine Taste verwenden, verwende ich einen Hyperlink:
<Grid>
<TextBlock>
<Hyperlink
NavigateUri="Second.xaml">Go!
</Hyperlink>
</TextBlock>
</Grid>
alles wie erwartet funktioniert. Das bedeutet aber, meine UI Anforderungen, die einen Hyperlink mit der rechten out ist. Ich brauche eine große Fett Taste für die Menschen zu drücken. Deshalb möchte ich die Taste verwenden, um zu navigieren. Ich will nur wissen, wie ich den Knopf bekommt die gleiche Möglichkeit zu geben, dass der Hyperlink funktioniert in diesem Fall.
Lösung
Nach dem Dokumentation rel="nofollow , nur DocumentViewer
und FlowDocumentViewer
diesen Befehl speziell implementieren. Sie werden müssen entweder einen Befehl für die Navigation finden die Geräte NavigationWindow
oder ein CommandBinding
für diesen Befehl einrichten und handhaben Sie es selbst.
Andere Tipps
In XAML:
<Button Command="{x:Static Views:Commands.NavigateHelp}" Content="Help"/>
In Views (Wir haben eine Commands.cs
-Datei, die alle diese enthält):
public static RoutedCommand NavigateHelp = new RoutedCommand();
In der Seite contstructor, können Sie verbinden die beiden:
CommandBindings.Add(new CommandBinding(Commands.NavigateHelp, NavigateHelpExecute));
NavigateHelpExecute hinter im Code sein (was wir tun), Haken in ein Ansichtsmodell Event-Handler, oder was auch immer. Das Schöne daran ist, dass Sie andere Navigations deaktivieren können wie folgt:
CommandBindings.Add(new CommandBinding(NavigationCommands.Refresh, null));
Hope, das hilft.
Sie wollen die NavigationService
Ihrer NavigationWindow
wie folgt verwenden:
XAML:
<Button HorizontalAlignment="Right" Name="continueButton" Width="75" Margin="0,0,8,11" Height="23" VerticalAlignment="Bottom" Click="continueButton_Click">
Continue
</Button>
C #:
private void continueButton_Click(object sender, RoutedEventArgs e)
{
this.NavigationService.GoForward();
//or
this.NavigationService.Navigate("Second.xaml")
}
Mit jeder dieser Sie verwenden this
verwenden können, zeige ich nur die NavigationService
hier für Klarheit
public class NavigateButton : Button
{
public Uri NavigateUri { get; set; }
public NavigateButton()
{
Click += NavigateButton_Click;
}
void NavigateButton_Click(object sender, System.Windows.RoutedEventArgs e)
{
var navigationService = NavigationService.GetNavigationService(this);
if (navigationService != null)
navigationService.Navigate(NavigateUri);
}
}
Und dann können Sie die folgenden in Ihrem XAML setzen:
<local:NavigateButton Content="NavigateButton" NavigateUri="Page2.xaml"/>
Dann brauchen Sie noch keinen Code hinter Ihren Seiten, und Sie müssen keine Befehle zu Ihrem Ansichtsmodell hinzuzufügen.