Usando um botão para navegar para outra página em um NavigationWindow
-
03-07-2019 - |
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.
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.