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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top