2009-04-29 14 views
6

Estoy tratando de usar el marco de comandos de navegación en WPF para navegar entre páginas dentro de una aplicación WPF (escritorio, no XBAP o Silverlight).Usando un botón para navegar a otra página en una ventana de navegación

Creo que tengo todo configurado correctamente, pero no funciona. Construyo y corro sin errores, no recibo ningún error de enlace en la ventana de resultados, pero mi botón de navegación está desactivado.

Aquí está la App.xaml para una aplicación de ejemplo:

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

Tenga en cuenta los puntos StartupUri a First.xaml. First.xaml es una página. WPF aloja automáticamente mi página en una ventana de navegación. Aquí está 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 CommandTarget del botón se establece en NavigationWindow. El comando es GoToPage y la página es /Second.xaml. Intenté configurar CommandTarget en la página que contiene, CommandParameter en "Second.xaml" (First.xaml y Second.xaml están en la raíz de la solución) y he intentado dejar el CommandTarget vacío. También intenté configurar el Camino a la vinculación a varias propiedades públicas relacionadas con la navegación en NavigationWindow. Nada ha funcionado hasta ahora.

¿Qué me falta aquí? I realmente no quiero hacer mi navegación en el código.


Aclaración.

Si, en lugar de utilizar un botón, utilizo un hipervínculo:

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

todo funciona como se esperaba. Sin embargo, mis requisitos de UI significa que usar un hipervínculo es correcto. Necesito un gran botón graso para que la gente presione. Es por eso que quiero usar el botón para navegar. Solo quiero saber cómo puedo hacer para que Button proporcione la misma capacidad que tiene el hipervínculo en este caso.

Respuesta

4

De acuerdo con documentation, solo DocumentViewer y FlowDocumentViewer implementan este comando específicamente. Necesitará encontrar un comando de navegación que NavigationWindow implemente, o configurar un CommandBinding para este comando y manejarlo usted mismo.

+0

Gracias, pero eso no es exactamente aplicable en este caso. He editado mi pregunta para aclararla. Estoy tratando de encontrar una manera para que el botón Comando la ventana de navegación vaya a continuación. Mi código no funciona, así que no estoy insistiendo en que se haga de esa manera. Estoy buscando una forma de hacer que un botón funcione con NavigationWindow. – Will

+0

Básicamente, esta es la única forma de hacerlo. Estoy usando comandos en mi máquina virtual para enganchar los botones. El modelo de vista base contiene una referencia al servicio de navegación de la ventana principal. – Will

2

Usted tendrá que utilizar el NavigationService de su NavigationWindow de la siguiente manera:

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

Con cualquiera de ello se puede utilizar el uso this, me solo muestre el NavigationService aquí para mayor claridad

+0

Esto funciona, pero para MVVM es preferible el patrón de comando. Gracias por la respuesta. – Will

4

En XAML:

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

En Vistas (Tenemos un archivo Commands.cs que contiene todos estos):

public static RoutedCommand NavigateHelp = new RoutedCommand(); 

en la página de contstructor, puede conectar los dos:

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

NavigateHelpExecute puede estar en el código subyacente (que es lo que hacemos), enlazar en un controlador de eventos de ViewModel, o lo que sea. La belleza de esto es que puede deshabilitar otra navegación como así:

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

Espero que esto ayude.

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

Y entonces usted puede poner lo siguiente en su xaml:

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

Entonces todavía no necesitan código detrás de sus páginas, y que no es necesario añadir comandos a su modelo de vista.

Cuestiones relacionadas