删除导航服务上的转发条目?

Posted

技术标签:

【中文标题】删除导航服务上的转发条目?【英文标题】:Remove forward entry on Navigation service? 【发布时间】:2010-12-26 21:24:10 【问题描述】:

如何删除导航服务中的所有转发条目?

我试过了,但它崩溃了。

    while (NavigationService.CanGoForward) NavigationService.RemoveBackEntry();

我知道“RemoveBackEntry()”看起来很奇怪,但没有 RemoveForwardEntry() 方法。

有什么想法吗?

谢谢, 可汗

编辑 1: 我更近一点,我可以访问前向堆栈,甚至可以输出其中的每个项目,但我似乎无法弄清楚如何删除条目。 _frame.ForwardStack 或 j 上的任何属性或方法都没有提供有关如何删除这些条目的任何见解。

        Window mainWindow = Application.Current.MainWindow;
        Frame _frame = (Frame)mainWindow.FindName("mainFrame");
        foreach (JournalEntry j in _frame.ForwardStack)
        
            MessageBox.Show(j.Name);
        

【问题讨论】:

【参考方案1】:

嗯,答案永远不会太晚!

以下代码将简单地禁用向前导航:

    void Frame_Navigating(object sender, NavigatingCancelEventArgs e)
    
        bool b = e.NavigationMode == NavigationMode.Forward;
        if (b)
        

            e.Cancel = true;
        
    

目前它适用于Frame.Navigating 事件,但它应该适用于ApplicationNavigationWindow(虽然没有测试)。

编辑:

这里是BehaviorFrame

public class FrameNavigationBehavior : Behavior<Frame>

    public static readonly DependencyProperty CanGoForwardProperty = DependencyProperty.Register(
        "CanGoForward", typeof (bool), typeof (FrameNavigationBehavior), new PropertyMetadata(true));

    public static readonly DependencyProperty CanGoBackwardProperty = DependencyProperty.Register(
        "CanGoBackward", typeof (bool), typeof (FrameNavigationBehavior), new PropertyMetadata(true));

    public static readonly DependencyProperty CanRefreshProperty = DependencyProperty.Register(
        "CanRefresh", typeof (bool), typeof (FrameNavigationBehavior), new PropertyMetadata(true));

    public bool CanGoForward
    
        get  return (bool) GetValue(CanGoForwardProperty); 
        set  SetValue(CanGoForwardProperty, value); 
    

    public bool CanGoBackward
    
        get  return (bool) GetValue(CanGoBackwardProperty); 
        set  SetValue(CanGoBackwardProperty, value); 
    

    public bool CanRefresh
    
        get  return (bool) GetValue(CanRefreshProperty); 
        set  SetValue(CanRefreshProperty, value); 
    

    protected override void OnAttached()
    
        base.OnAttached();
        AssociatedObject.Navigating += AssociatedObject_Navigating;
    

    protected override void OnDetaching()
    
        base.OnDetaching();
        AssociatedObject.Navigating -= AssociatedObject_Navigating;
    

    private void AssociatedObject_Navigating(object sender, NavigatingCancelEventArgs e)
    
        NavigationMode navigationMode = e.NavigationMode;
        switch (navigationMode)
        
            case NavigationMode.New:
                break;
            case NavigationMode.Back:
                if (!CanGoBackward)
                
                    e.Cancel = true;
                
                break;
            case NavigationMode.Forward:
                if (!CanGoForward)
                
                    e.Cancel = true;
                
                break;
            case NavigationMode.Refresh:
                if (!CanRefresh)
                
                    e.Cancel = true;
                
                break;
            default:
                throw new ArgumentOutOfRangeException();
        
    

【讨论】:

我不认为这会将它从堆栈中取出,所以它不会清除或任何东西。【参考方案2】:

我进一步阅读了 wpf 导航,如果您可以访问应用程序的 NavigationWindow 实例,则有一个名为 ForwardStack 的属性,其中包含前进导航页面的列表。您应该能够从那里添加或删除页面。

我自己没有尝试过这个,因为我现在没有一个项目来测试这个所以让我知道这是否有效,因为我想在未来自己尝试这个。

查看完整成员列表的 msdn 链接:http://msdn.microsoft.com/en-us/library/system.windows.navigation.navigationwindow_members.aspx

【讨论】:

取得了一些进展,但还不够,请参阅编辑 1。有什么想法吗? 后向和前向堆栈是只读的。如何删除页面?【参考方案3】:

如果您在后退后重新导航到当前页面,您应该会丢失所有前向数据,就像在 Web 浏览器或 Windows 资源管理器中一样。

如果您不希望刷新显示在后备列表中,则可以从后备列表中删除最后一个条目。

【讨论】:

我确实想知道,我不希望为当前页面添加一个后退条目。我想最好的方法是尝试一下。 我在使用这个解决方案时遇到了问题,我无法加载当前页面,我只能加载此页面的新实例,但我担心它会被添加到日志堆栈中。

以上是关于删除导航服务上的转发条目?的主要内容,如果未能解决你的问题,请参考以下文章

使用 upnp 以编程方式将端口转发条目添加到路由器中?

pfSense2.32端口转发设置

markdown 子域转发到Localhost上的Web服务器

Vagrant上的Rails 4.2服务器端口转发不起作用

7.CCNA第七天-探索数据转发

两次端口转发:在本机远程使用服务器上的TensorBoard