Pregunta

Estoy intentando utilizar 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).

Creo que tengo todo configurado correctamente, pero no funciona.Construyo y ejecuto sin errores, no obtengo ningún error de enlace en la ventana de Salida, pero mi botón de navegación está deshabilitado.

Aquí está el app.xaml para una aplicación de muestra:

<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 que StartupUri apunta a First.xaml.First.xaml es una página.WPF aloja automáticamente mi página en una ventana de navegación.Aquí está el primer archivo.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>

El CommandTarget del botón está configurado 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 ambos en la raíz de la solución) e intenté dejar CommandTarget vacío.También intenté configurar la ruta al enlace en varias propiedades públicas relacionadas con la navegación en NavigationWindow.Nada ha funcionado hasta ahora.

¿Que me estoy perdiendo aqui?I en realidad No quiero hacer mi navegación en código.


Aclaración.

Si en lugar de usar un botón uso un Hipervínculo:

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

todo funciona como se esperaba.Sin embargo, mis requisitos de interfaz de usuario significan que usar un hipervínculo está descartado.Necesito un botón grande y gordo para que la gente lo presione.Por eso quiero usar el botón para navegar.Solo quiero saber cómo puedo hacer que el Botón proporcione la misma capacidad que el Hipervínculo en este caso.

¿Fue útil?

Solución

De acuerdo con la documentación, solo DocumentViewer y FlowDocumentViewer implementar este comando específicamente.Necesitará encontrar un comando de navegación que NavigationWindow implementar, o establecer un CommandBinding para este comando y manejarlo usted mismo.

Otros consejos

En XAML:

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

En Vistas (Tenemos un archivo Commands.cs que contiene todo esto):

public static RoutedCommand NavigateHelp = new RoutedCommand();

En el constructor de página, puede conectar los dos:

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

NavigateHelpExecute puede estar en el código detrás (que es lo que hacemos), conectarse a un controlador de eventos ViewModel o lo que sea. Lo bueno de esto es que puede deshabilitar otra navegación así:

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

Espero que esto ayude.

Deberá 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 estos puede usar el uso this, solo muestro el <=> aquí para mayor claridad

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 luego puedes poner lo siguiente en tu xaml:

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

Entonces todavía no necesita código detrás de sus páginas, y no necesita agregar comandos a su modelo de vista.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top