Как отключить навигационные ярлыки во фрейме c # WPF - PullRequest
10 голосов
/ 16 июня 2011

Как отключить ярлыки навигации в кадре (например, «Backspace» для навигации назад и «Alt + стрелка вправо» для навигации вперед).

Я хочу использовать другие функции клавиатуры, поэтому хочу отключить сочетания клавиш для фрейма.

Кто может мне помочь?

Ответы [ 5 ]

14 голосов
/ 14 июня 2012

есть более элегантное решение, в котором поведение Attached может использоваться для отключения навигации без фактического расширения кадра.

создать прикрепленное поведение:

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 голосов
/ 21 августа 2014

См. Этот ответ о том, как отключить сочетания клавиш:

Отключить возврат в wpf

Это не работает для кнопок навигации назад и вперед. Чтобы этого не произошло, вам нужно поместить обработчик в событие Navigating и отменить его, если он вам не нужен.

Например, чтобы полностью отключить прямую навигацию:

В .xaml:

<Frame Navigating="HandleNavigating" />

В коде позади:

    void HandleNavigating(Object sender, NavigatingCancelEventArgs e)
    {
        if (e.NavigationMode == NavigationMode.Forward)
        {
            e.Cancel = true;
        }
    }
0 голосов
/ 03 апреля 2019

Реальный ответ для отключения всех ярлыков в 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) => { }));
}
0 голосов
/ 09 марта 2012

Что я делаю, так это размещаю контент в ContentControl.

0 голосов
/ 23 ноября 2011

Фрейм сам по себе не предоставляет способа отключения навигации. Это только средство скрыть элементы управления навигацией. Однако вы можете наследовать от класса 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" />
...