2009-04-29 8 views
6

J'essaie d'utiliser l'infrastructure de commande de navigation dans WPF pour naviguer entre Pages dans une application WPF (bureau, pas XBAP ou Silverlight).Utilisation d'un bouton pour naviguer vers une autre page dans une NavigationWindow

Je crois avoir tout configuré correctement, mais cela ne fonctionne pas. Je compile et exécute sans erreurs, je ne reçois aucune erreur de liaison dans la fenêtre Sortie, mais mon bouton de navigation est désactivé.

Voici le app.xaml pour une application exemple:

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

Notez les points StartupUri à First.xaml. First.xaml est une Page. WPF héberge automatiquement ma page dans un NavigationWindow. Voici 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> 

La commande CommandTarget du bouton est définie sur NavigationWindow. La commande est GoToPage et la page est /Second.xaml. J'ai essayé de définir le CommandTarget à la page contenant, le CommandParameter à "Second.xaml" (First.xaml et Second.xaml sont à la racine de la solution), et j'ai essayé de laisser le CommandTarget vide. J'ai également essayé de définir le chemin d'accès à la liaison vers diverses propriétés publiques liées à la navigation dans NavigationWindow. Rien n'a fonctionné jusqu'ici.

Qu'est-ce qui me manque ici? Je vraiment ne veux pas faire ma navigation dans le code.


Clarification.

Si, au lieu d'utiliser un bouton, j'utiliser un lien hypertexte:

<Grid> 
    <TextBlock> 
     <Hyperlink 
      NavigateUri="Second.xaml">Go! 
     </Hyperlink> 
    </TextBlock> 
</Grid> 

tout fonctionne comme prévu. Cependant, mes exigences d'interface utilisateur signifie que l'utilisation d'un lien hypertexte est juste. J'ai besoin d'un gros bouton gras pour que les gens puissent appuyer. C'est pourquoi je veux utiliser le bouton pour naviguer. Je veux juste savoir comment je peux obtenir le bouton pour fournir la même capacité que l'hyperlien fait dans ce cas.

Répondre

4

Selon le documentation, seuls DocumentViewer et FlowDocumentViewer implémentent cette commande spécifiquement. Vous devez soit trouver une commande pour la navigation que NavigationWindow implémente, soit configurer un CommandBinding pour cette commande et la gérer vous-même.

+0

Merci, mais ce n'est pas exactement applicable dans ce cas. J'ai édité ma question pour espérer la clarifier. J'essaie de trouver un moyen pour le bouton de commander la NavigationWindow où aller ensuite. Mon code ne fonctionne pas, donc je n'insiste pas pour que cela se fasse de cette façon. Je cherche un moyen d'obtenir un bouton pour travailler avec la NavigationWindow. – Will

+0

Essentiellement, c'est la seule façon de faire cela. J'utilise des commandes dans ma machine virtuelle pour accrocher les boutons. Le modèle de vue de base contient une référence au service de navigation de la fenêtre principale. – Will

2

Vous voulez utiliser le NavigationService de votre NavigationWindow comme suit:

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") 
    } 

Avec l'un de cela, vous pouvez utiliser l'utilisation this, je seulement montrer le NavigationService ici pour plus de clarté

+0

Cela fonctionne, mais pour MVVM, le modèle de commande est préférable. Merci d'avoir répondu. – Will

4

En XAML:

<Button Command="{x:Static Views:Commands.NavigateHelp}" Content="Help"/> 

Vues (Nous avons un fichier Commands.cs qui contient tous ces éléments):

public static RoutedCommand NavigateHelp = new RoutedCommand(); 

Dans la page contstructor, vous pouvez connecter les deux:

CommandBindings.Add(new CommandBinding(Commands.NavigateHelp, NavigateHelpExecute)); 

NavigateHelpExecute peut être dans le code derrière (ce que nous faisons), se connecter à un gestionnaire d'événement ViewModel, ou autre. La beauté de ceci est que vous pouvez désactiver d'autres navigation comme suit:

CommandBindings.Add(new CommandBinding(NavigationCommands.Refresh, null)); 

Espérons que cela aide.

0
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); 
    } 
} 

Et vous pouvez mettre ce qui suit dans votre XAML:

<local:NavigateButton Content="NavigateButton" NavigateUri="Page2.xaml"/>

vous n'avez pas encore besoin de code derrière vos pages, et vous n'avez pas besoin d'ajouter des commandes à votre viewmodel.