【发布时间】:2011-06-16 06:21:34
【问题描述】:
如何禁用框架中的导航快捷方式(例如,用于向后导航的“Backspace”和用于向前导航的“Alt+右箭头”)。
我想使用其他键盘功能,所以我想禁用框架的导航快捷键。
谁能帮帮我?
【问题讨论】:
标签: c# wpf keyboard keyboard-shortcuts
如何禁用框架中的导航快捷方式(例如,用于向后导航的“Backspace”和用于向前导航的“Alt+右箭头”)。
我想使用其他键盘功能,所以我想禁用框架的导航快捷键。
谁能帮帮我?
【问题讨论】:
标签: c# wpf keyboard keyboard-shortcuts
有一个更优雅的解决方案,可以使用附加行为来禁用导航,而无需实际扩展框架。
创建附加行为:
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"
【讨论】:
有关如何禁用键盘快捷键的信息,请参阅此答案:
这不适用于后退和前进导航鼠标按钮。为了防止这种情况,您似乎需要在 Navigating 事件上放置一个处理程序,如果您不想要它,请取消它。
例如,完全禁用向前导航:
在 .xaml 中:
<Frame Navigating="HandleNavigating" />
在后面的代码中:
void HandleNavigating(Object sender, NavigatingCancelEventArgs e)
{
if (e.NavigationMode == NavigationMode.Forward)
{
e.Cancel = true;
}
}
【讨论】:
在 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) => { }));
}
【讨论】:
它自己的框架没有提供禁用导航的方法。它只提供了一种隐藏导航控件的方法。但是,您可以从 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" />
【讨论】:
我所做的是在 ContentControl 中托管内容。
【讨论】: