【问题标题】:How disable navigation shortcuts in frame c# WPF如何在框架 c# WPF 中禁用导航快捷方式
【发布时间】:2011-06-16 06:21:34
【问题描述】:

如何禁用框架中的导航快捷方式(例如,用于向后导航的“Backspace”和用于向前导航的“Alt+右箭头”)。

我想使用其他键盘功能,所以我想禁用框架的导航快捷键。

谁能帮帮我?

【问题讨论】:

    标签: c# wpf keyboard keyboard-shortcuts


    【解决方案1】:

    有一个更优雅的解决方案,可以使用附加行为来禁用导航,而无需实际扩展框架。

    创建附加行为:

    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Navigation;
    
    namespace A
    {
        public static class DisableNavigation
        {
            public static bool GetDisable(DependencyObject o)
            {
                return (bool)o.GetValue(DisableProperty);
            }
            public static void SetDisable(DependencyObject o, bool value)
            {
                o.SetValue(DisableProperty, value);
            }
    
            public static readonly DependencyProperty DisableProperty =
                DependencyProperty.RegisterAttached("Disable", typeof(bool), typeof(DisableNavigation),
                                                    new PropertyMetadata(false, DisableChanged));
    
    
    
            public static void DisableChanged(object sender, DependencyPropertyChangedEventArgs e)
            {
                var frame = (Frame)sender;
                           frame.Navigated += DontNavigate;
                frame.NavigationUIVisibility = NavigationUIVisibility.Hidden;
            }
    
            public static void DontNavigate(object sender, NavigationEventArgs e)
            {
                ((Frame)sender).NavigationService.RemoveBackEntry();
            }
        }
    }
    

    并且在 xaml 中添加这个每当你使用一个框架:

    <Frame beha:DisableNavigation.Disable="True" />
    

    并在 xaml 顶部添加导入:

    xmlns:beha="clr-namespace:A"
    

    【讨论】:

      【解决方案2】:

      有关如何禁用键盘快捷键的信息,请参阅此答案:

      Disable backspace in wpf

      这不适用于后退和前进导航鼠标按钮。为了防止这种情况,您似乎需要在 Navigating 事件上放置一个处理程序,如果您不想要它,请取消它。

      例如,完全禁用向前导航:

      在 .xaml 中:

      <Frame Navigating="HandleNavigating" />
      

      在后面的代码中:

          void HandleNavigating(Object sender, NavigatingCancelEventArgs e)
          {
              if (e.NavigationMode == NavigationMode.Forward)
              {
                  e.Cancel = true;
              }
          }
      

      【讨论】:

      • 这个简单的解决方案对我有用。但还要添加代码以禁用后退导航: if(e.NavigationMode == NavigationMode.Back) { e.Cancel = true; }
      【解决方案3】:

      在 WPF Frame 中禁用所有快捷方式的真正答案是:

      foreach (var vNavigationCommand in new RoutedUICommand[] 
                      {   NavigationCommands.BrowseBack,
                          NavigationCommands.BrowseForward,
                          NavigationCommands.BrowseHome,
                          NavigationCommands.BrowseStop,
                          NavigationCommands.Refresh,
                          NavigationCommands.Favorites,
                          NavigationCommands.Search,
                          NavigationCommands.IncreaseZoom,
                          NavigationCommands.DecreaseZoom,
                          NavigationCommands.Zoom,
                          NavigationCommands.NextPage,
                          NavigationCommands.PreviousPage,
                          NavigationCommands.FirstPage,
                          NavigationCommands.LastPage,
                          NavigationCommands.GoToPage,
                          NavigationCommands.NavigateJournal })
      {
          ctlFrame.CommandBindings.Add(new CommandBinding(vNavigationCommand, (sender, args) => { }));
      }
      

      【讨论】:

        【解决方案4】:

        它自己的框架没有提供禁用导航的方法。它只提供了一种隐藏导航控件的方法。但是,您可以从 Frame 类继承并自己对其进行一些修改。以下示例在每次页面导航时从 BackStack 中删除最后一页。从而确保框架永远不会向后导航,因为它不知道最后一页。

        class NoNavFrame : Frame
        {
            public NoNavFrame()
            {
                this.Navigated += new System.Windows.Navigation.NavigatedEventHandler(NoNavFrame_Navigated);
            }
        
            void NoNavFrame_Navigated(object sender, System.Windows.Navigation.NavigationEventArgs e)
            {
                this.NavigationService.RemoveBackEntry();
            }
        }
        

        然后您可以将其包含在 XAML 中,如下所示...

            <myControls:NoNavFrame x:Name="myFrame" NavigationUIVisibility="Hidden" />
        

        【讨论】:

          【解决方案5】:

          我所做的是在 ContentControl 中托管内容。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-09-27
            • 2011-01-17
            • 1970-01-01
            • 2012-06-30
            • 1970-01-01
            • 1970-01-01
            • 2015-10-12
            • 2021-11-19
            相关资源
            最近更新 更多