UWP在基页中添加事件处理程序会导致AccessViolationException

时间:2016-09-30 12:40:47

标签: c# xaml uwp

我有' BasePage' class是我项目中所有其他页面的基类。 在初始化中,我为SystemNavigationManager'添加了EventHandler。对于事件' BackRequest'。由于某种原因,行ID导致“AccessViolationException”'当XAML设计师试图渲染扩展的类的XAML' BasePage'

我对UWP并不熟悉,所以我会非常感谢提示。

BasePage

public class BasePage: Page {
    internal string title = "";
    internal HeaderView headerView;

    public BasePage() {
        this.Loaded += BasePage_Loaded;

        // FIXME: For some reason if this line is uncommented then xaml designer fails. 
        SystemNavigationManager.GetForCurrentView().BackRequested += BasePage_BackRequested;

    }

    private void BasePage_BackRequested(object sender, BackRequestedEventArgs e) {
        bool handled = e.Handled;
        this.BackRequested(ref handled);
        e.Handled = handled;
    }

    private void BackRequested(ref bool handled) {
        //Get a hold of the current frame so that we can inspect the app back stack.

        if (this.Frame == null)
            return;

        // Check to see if this is the top-most page on the app back stack.
        if (this.Frame.CanGoBack && !handled) {
            // If not, set the event to handled and go back to the previous page in the app.
            handled = true;
            this.Frame.GoBack();
        }
    }

    private void setupPageAnimation() {
        TransitionCollection collection = new TransitionCollection();
        NavigationThemeTransition theme = new NavigationThemeTransition();

        var info = new ContinuumNavigationTransitionInfo();

        theme.DefaultNavigationTransitionInfo = info;
        collection.Add(theme);
        this.Transitions = collection;
    }

    private void BasePage_Loaded(object sender, Windows.UI.Xaml.RoutedEventArgs e) {

        setupPageAnimation();
    }
}

就像 Ivan 所说,最终代码看起来像这样。没有一丝虫子。

的BasePage

public BasePage() {
    this.Loaded += BasePage_Loaded;
}

protected override void OnNavigatedTo(NavigationEventArgs e) {
    base.OnNavigatedTo(e);
    SystemNavigationManager.GetForCurrentView().BackRequested += BasePage_BackRequested;
}

protected override void OnNavigatedFrom(NavigationEventArgs e) {
    base.OnNavigatedFrom(e);
    SystemNavigationManager.GetForCurrentView().BackRequested -= BasePage_BackRequested;
}

1 个答案:

答案 0 :(得分:1)

您不应订阅构建函数的后退事件,而是OnNavigatedTo并在OnNavigatedFrom中取消订阅。即使它没有崩溃也会导致很多问题,因为当您按下后退按钮时,后面的逻辑将在所有以前的页面上激活。