Lar*_*ele 10 c# keyboard wpf keyboard-shortcuts
如何禁用框架中的导航快捷方式(例如,"Backspace"用于向后导航,"Alt +向右箭头"用于向前导航).
我想使用其他键盘功能,所以我想禁用框架的导航快捷方式.
谁能帮我?
Osa*_*ved 15
有一个更优雅的解决方案,其中附加行为可用于禁用导航而不实际扩展框架.
创建附加行为:
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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
在xaml中,每当你使用一个框架时添加它:
<Frame beha:DisableNavigation.Disable="True" />
Run Code Online (Sandbox Code Playgroud)
并在xaml的顶部添加导入:
xmlns:beha="clr-namespace:A"
Run Code Online (Sandbox Code Playgroud)
有关如何禁用键盘快捷键的信息,请参阅此答案:
这不适用于后退和前进导航鼠标按钮。为了防止这种情况发生,您似乎需要在导航事件上放置一个处理程序,如果您不需要,则将其取消。
例如,要完全禁用向前导航:
在.xaml中:
<Frame Navigating="HandleNavigating" />
Run Code Online (Sandbox Code Playgroud)
在后面的代码中:
void HandleNavigating(Object sender, NavigatingCancelEventArgs e)
{
if (e.NavigationMode == NavigationMode.Forward)
{
e.Cancel = true;
}
}
Run Code Online (Sandbox Code Playgroud)
它本身的框架没有提供禁用导航的方法。它仅提供隐藏导航控件的方法。不过,您可以继承 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();
}
}
Run Code Online (Sandbox Code Playgroud)
然后您可以将其包含在 XAML 中,如下所示...
<myControls:NoNavFrame x:Name="myFrame" NavigationUIVisibility="Hidden" />
Run Code Online (Sandbox Code Playgroud)