Pergunta

Eu estou tentando usar a estrutura de comando de navegação em WPF para navegar entre as páginas dentro de um aplicativo WPF (desktop; não XBAP ou Silverlight).

Acredito que tenho tudo configurado corretamente, mas não o seu trabalho. Eu construir e executar sem erros, eu não estou recebendo erros de ligação na janela de saída, mas meu botão de navegação está desativado.

Aqui está o app.xaml para um aplicativo de exemplo:

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

Observe os pontos StartupUri para First.xaml. First.xaml é uma página. WPF hospeda automaticamente minha página em um NavigationWindow. Aqui 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>

CommandTarget do botão está definido para o NavigationWindow. O comando é GoToPage, ea página é /Second.xaml. Eu tentei definindo o CommandTarget ao contendo página, o CommandParameter para "Second.xaml" (First.xaml e Second.xaml estão ambos na raiz da solução), e eu tentei sair do CommandTarget esvaziar. Eu também tentei definir o caminho à ligação a várias propriedades públicas navegação-relacionados no NavigationWindow. Nada funcionou até agora.

O que estou ausente aqui? I realmente não quero fazer a minha navegação no código.


Clarificação.

Se, em vez de usar um botão, eu uso um Hyperlink:

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

tudo funciona como esperado. No entanto, os meus requisitos de interface do usuário significa que usar um hiperlink é certo. Eu preciso de um botão gordo grande para as pessoas a imprensa. É por isso que eu quero usar o botão de navegar. Eu só quero saber como posso obter o botão para fornecer a mesma capacidade que o Hyperlink faz neste caso.

Foi útil?

Solução

De acordo com a documentação apenas DocumentViewer e FlowDocumentViewer implementar este comando especificamente. Você precisa se quer encontrar um comando de navegação que implementa NavigationWindow, ou configurar uma CommandBinding para este comando e lidar com isso sozinho.

Outras dicas

Em XAML:

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

Em Visualizações (Temos um arquivo Commands.cs que contém todos estes):

public static RoutedCommand NavigateHelp = new RoutedCommand();

No contstructor página, você pode conectar os dois:

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

NavigateHelpExecute pode estar no trás código (que é o que fazemos), gancho em um manipulador de eventos ViewModel, ou o que quer. A beleza disto é que você pode desativar outra navegação assim:

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

Espero que isso ajude.

Você vai querer usar o NavigationService do seu NavigationWindow da seguinte forma:

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

Com qualquer um isso, você pode usar uso this, eu só mostrar o NavigationService aqui para maior clareza

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, em seguida, você pode colocar o seguinte em seu XAML:

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

código Então você ainda não precisa de trás suas páginas, e você não precisa adicionar comandos para o seu viewmodel.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top