Utilizzo di un pulsante per navigare verso un'altra pagina in una finestra di navigazione

StackOverflow https://stackoverflow.com/questions/803921

  •  03-07-2019
  •  | 
  •  

Domanda

Sto cercando di utilizzare il framework dei comandi di navigazione in WPF per navigare tra le pagine all'interno di un'applicazione WPF (desktop; non XBAP o Silverlight).

Credo di aver configurato tutto correttamente, ma non funziona. Costruisco ed eseguo senza errori, non visualizzo alcun errore di associazione nella finestra Output, ma il mio pulsante di navigazione è disabilitato.

Ecco l'app.xaml per un'app di esempio:

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

Nota che StartupUri punta a First.xaml. First.xaml è una pagina. WPF ospita automaticamente la mia pagina in una finestra di navigazione. Ecco 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>

Il CommandTarget del pulsante è impostato su NavigationWindow. Il comando è GoToPage e la pagina è /Second.xaml. Ho provato a impostare CommandTarget sulla Pagina contenente, CommandParameter su & Quot; Second.xaml & Quot; (First.xaml e Second.xaml sono entrambi nella radice della soluzione) e ho provato a lasciare vuoto CommandTarget. Ho anche provato a impostare il Path to the Binding su varie proprietà pubbliche relative alla navigazione nella NavigationWindow. Finora nulla ha funzionato.

Cosa mi sto perdendo qui? davvero non voglio navigare nel codice.


Chiarimento.

Se, invece di utilizzare un pulsante, utilizzo un collegamento ipertestuale:

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

tutto funziona come previsto. Tuttavia, i miei requisiti dell'interfaccia utente indicano che l'utilizzo di un collegamento ipertestuale è immediato. Ho bisogno di un grosso pulsante grasso che le persone possano premere. Ecco perché voglio usare il pulsante per navigare. Voglio solo sapere come posso ottenere il pulsante per fornire la stessa capacità che l'hyperlink in questo caso.

È stato utile?

Soluzione

Secondo la documentazione , solo DocumentViewer e FlowDocumentViewer implementano questo comando in modo specifico. Dovrai trovare un comando per la navigazione che NavigationWindow implementa oppure impostare un CommandBinding per questo comando e gestirlo tu stesso.

Altri suggerimenti

In XAML:

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

In Views (abbiamo un Commands.cs file che contiene tutti questi):

public static RoutedCommand NavigateHelp = new RoutedCommand();

Nel configuratore di pagine, puoi collegare i due:

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

NavigateHelpExecute può essere nel codice dietro (che è quello che facciamo), agganciarsi a un gestore di eventi ViewModel o qualsiasi altra cosa. Il bello di questo è che puoi disabilitare altri tipi di navigazione in questo modo:

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

Spero che questo aiuti.

Dovrai utilizzare il NavigationService del tuo NavigationWindow come segue:

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 una di queste due opzioni puoi usare this, mostro solo <=> qui per chiarezza

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

E quindi puoi inserire quanto segue nel tuo xaml:

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

Quindi non hai ancora bisogno del codice dietro le tue pagine e non hai bisogno di aggiungere comandi al tuo viewmodel.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top