wpf - pasar - Usar un botón para navegar a otra página en una ventana de navegación
ventanas emergentes en wpf (4)
Estoy tratando de usar el marco de comandos de navegación en WPF para navegar entre las páginas dentro de una aplicación WPF (escritorio, no XBAP o Silverlight).
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á deshabilitado.
Aquí está la 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á 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 está configurada 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.
¿Que me estoy perdiendo aqui? Realmente no quiero hacer mi navegación en el 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 espera 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.
De acuerdo con la documentación , solo DocumentViewer
y FlowDocumentViewer
implementan este comando específicamente. Necesitará encontrar un comando de navegación que implemente NavigationWindow
, o configurar un CommandBinding
para este comando y manejarlo usted mismo.
Deseará utilizar NavigationService
de su NavigationWindow
siguiente manera:
XAML:
<Button HorizontalAlignment="Right" Name="continueButton" Width="75" Margin="0,0,8,11" Height="23" VerticalAlignment="Bottom" Click="continueButton_Click">
Continue
</Button>
DO#:
private void continueButton_Click(object sender, RoutedEventArgs e)
{
this.NavigationService.GoForward();
//or
this.NavigationService.Navigate("Second.xaml")
}
Con cualquiera de estos puede usar use this
, solo muestro el NavigationService
aquí para mayor claridad
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 la página 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), engancharse en un manejador de eventos de ViewModel, o lo que sea. La belleza de esto es que puedes deshabilitar otra navegación como esta:
CommandBindings.Add(new CommandBinding(NavigationCommands.Refresh, null));
Espero que esto ayude.
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.