[英]How to close NavigationWindow by a button of its page (VB WPF)
[英]Using a Button to navigate to another Page in a NavigationWindow
我正在尝试使用WPF中的导航命令框架在WPF应用程序(桌面;而不是XBAP或Silverlight)中的页面之间导航。
我相信我已经正确配置了一切,但它无法正常工作。 我构建并运行没有错误,我没有在输出窗口中收到任何绑定错误,但我的导航按钮被禁用。
这是示例应用程序的app.xaml:
<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>
注意StartupUri指向First.xaml。 First.xaml是一个页面。 WPF自动在NavigationWindow中托管我的页面。 这是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设置为NavigationWindow。 命令是GoToPage,页面是/Second.xaml。 我已经尝试将CommandTarget设置为包含的Page,将CommandParameter设置为“Second.xaml”(First.xaml和Second.xaml都在解决方案的根目录中),并且我尝试将CommandTarget留空。 我还尝试在NavigationWindow上设置绑定路径到各种与导航相关的公共属性。 到目前为止,没有任何工作。
我在这里错过了什么? 我真的不想在代码中进行导航。
澄清。
如果我使用超链接而不是使用按钮:
<Grid>
<TextBlock>
<Hyperlink
NavigateUri="Second.xaml">Go!
</Hyperlink>
</TextBlock>
</Grid>
一切都按预期工作。 但是,我的UI要求意味着使用超链接是正确的。 我需要一个巨大的脂肪按钮供人们按。 这就是我想使用按钮导航的原因。 我只是想知道如何让Button提供与Hyperlink在这种情况下相同的能力。
在XAML中:
<Button Command="{x:Static Views:Commands.NavigateHelp}" Content="Help"/>
在视图中(我们有一个包含所有这些的Commands.cs
文件):
public static RoutedCommand NavigateHelp = new RoutedCommand();
在Page contstructor中,您可以连接两个:
CommandBindings.Add(new CommandBinding(Commands.NavigateHelp, NavigateHelpExecute));
NavigateHelpExecute可以在后面的代码中(这是我们所做的),挂钩到ViewModel事件处理程序,或者其他什么。 这样做的好处是你可以禁用其他导航:
CommandBindings.Add(new CommandBinding(NavigationCommands.Refresh, null));
希望这可以帮助。
根据文档 ,只有DocumentViewer
和FlowDocumentViewer
专门实现此命令。 您需要找到NavigationWindow
实现的导航命令,或者为此命令设置CommandBinding
并自行处理。
您将需要使用NavigationService
的NavigationWindow
,如下所示:
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")
}
使用其中任何一个都可以使用this
,为了清楚起见,我只在此处显示NavigationService
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);
}
}
然后你可以在你的xaml中加入以下内容:
<local:NavigateButton Content="NavigateButton" NavigateUri="Page2.xaml"/>
然后,您仍然不需要页面后面的代码,也不需要向viewmodel添加命令。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.