使用按钮导航到导航窗口中的另一个页面

发布于 2024-07-18 04:30:13 字数 1776 浏览 10 评论 0原文

我正在尝试使用 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 自动将我的页面托管在导航窗口中。 这是 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 设置为包含页面,将 CommandParameter 设置为“Second.xaml”(First.xaml 和 Second.xaml 都位于解决方案的根目录中),并且我尝试将 CommandTarget 留空。 我还尝试将绑定路径设置为导航窗口上各种与导航相关的公共属性。 到目前为止还没有任何效果。

我在这里缺少什么? 我真的不想用代码进行导航。


澄清。

如果我不使用按钮,而是使用超链接:

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

一切都会按预期工作。 然而,我的 UI 要求意味着使用超链接是正确的。 我需要一个又大又胖的按钮供人们按下。 这就是为什么我想使用按钮进行导航。 我只是想知道如何让按钮提供与超链接在本例中相同的功能。

I'm trying to use the navigation command framework in WPF to navigate between Pages within a WPF application (desktop; not XBAP or Silverlight).

I believe I have everything configured correctly, yet its not working. I build and run without errors, I'm not getting any binding errors in the Output window, but my navigation button is disabled.

Here's the app.xaml for a sample app:

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

Note the StartupUri points to First.xaml. First.xaml is a Page. WPF automatically hosts my page in a NavigationWindow. Here's 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>

The button's CommandTarget is set to the NavigationWindow. The command is GoToPage, and the page is /Second.xaml. I've tried setting the CommandTarget to the containing Page, the CommandParameter to "Second.xaml" (First.xaml and Second.xaml are both in the root of the solution), and I've tried leaving the CommandTarget empty. I've also tried setting the Path to the Binding to various navigational-related public properties on the NavigationWindow. Nothing has worked so far.

What am I missing here? I really don't want to do my navigation in code.


Clarification.

If, instead of using a button, I use a Hyperlink:

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

everything works as expected. However, my UI requirements means that using a Hyperlink is right out. I need a big fatty button for people to press. That's why I want to use the button to navigate. I just want to know how I can get the Button to provide the same ability that the Hyperlink does in this case.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

天生の放荡 2024-07-25 04:30:13

根据文档,仅DocumentViewerFlowDocumentViewer专门实现了这个命令。 您需要找到 NavigationWindow 实现的导航命令,或者为此命令设置 CommandBinding 并自行处理。

According to the documentation, only DocumentViewer and FlowDocumentViewer implement this command specifically. You'll need to either find a command for navigation that NavigationWindow implements, or set up a CommandBinding for this command and handle it yourself.

命硬 2024-07-25 04:30:13

在 XAML 中:

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

在视图中(我们有一个包含所有这些内容的 Commands.cs 文件):

public static RoutedCommand NavigateHelp = new RoutedCommand();

在页面构造函数中,您可以连接两者:

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

NavigateHelpExecute 可以位于后面的代码中(这就是我们do),挂接到 ViewModel 事件处理程序,或者其他什么。 这样做的好处是您可以像这样禁用其他导航:

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

希望这有帮助。

In XAML:

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

In Views (We have a Commands.cs file that contains all of these):

public static RoutedCommand NavigateHelp = new RoutedCommand();

In the Page contstructor, you can connect the two:

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

NavigateHelpExecute can be in the code behind (which is what we do), hook into a ViewModel event handler, or whatever. The beauty of this is that you can disable other navigation like so:

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

Hope this helps.

亣腦蒛氧 2024-07-25 04:30:13

您将需要使用 NavigationWindowNavigationService,如下所示:

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

You will want to use the NavigationService of your NavigationWindow as follows:

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

With either of this you can use use this, I only show the NavigationService here for clarity

幸福不弃 2024-07-25 04:30:13
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 中:

然后您仍然不需要页面后面的代码,并且您不需要向视图模型添加命令。

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

And then you can put the following in your xaml:

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

Then you still don't need code behind your pages, and you don't need to add commands to your viewmodel.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文