控制Windows应用程序中的流程

时间:2012-01-19 14:01:52

标签: windows-phone-7 navigation singleton app.xaml

我的应用程序有一个名为CycleManager的单例类。我为此目的创建了一个密封类,如此

public sealed class CycleManager
{
    public static readonly CycleManager instance = new CycleManager();

    public CycleManager()
    {
        //ReadFromIsolatedStorage();
    }

    public static CycleManager Instance
    {
        get
        {
            return instance;
        }

    }
}

App.xaml.cs具有以下代码

    public App()
    {
        UnhandledException += Application_UnhandledException;

        InitializeComponent();

        InitializePhoneApplication();

        RootFrame.Navigating += new NavigatingCancelEventHandler(RootFrame_Navigating);            if (System.Diagnostics.Debugger.IsAttached)
        {
            Application.Current.Host.Settings.EnableFrameRateCounter = true;

            PhoneApplicationService.Current.UserIdleDetectionMode = IdleDetectionMode.Disabled;
        }
    }

我使用RootFrame_Navigating()来检查是否需要转到主页面或登录页面。

    void RootFrame_Navigating(object sender, NavigatingCancelEventArgs e)
    {
        //throw new NotImplementedException();
        if (e.Uri.ToString().Contains("/RootPage.xaml") != true)
            return;

        CycleManager pCycMan = CycleManager.instance;

        e.Cancel = true;
        RootFrame.Dispatcher.BeginInvoke(delegate
        {
            if (pCycMan.GetPasswordEnabled())
                RootFrame.Navigate(new Uri("/PasswordPage.xaml", UriKind.Relative));
            else
                RootFrame.Navigate(new Uri("/MainPage.xaml", UriKind.Relative));
        });
    }

我原本预计在RootFrame_Navigating()中调用实例时会创建Cyclemanager实例

但是调试向我展示了在App()构造之后的jus,控制流移动到Cycle管理器类,在CycleManager()构造函数之后移动到RootFrame_Navigating。 !有什么不对或我理解错了吗?

第二件事是在执行CycleManager pCycMan = CycleManager.instance;时我预计会调用CycleManager中的以下代码,但令人惊讶的是它不是。那么singleton属性如何管理?或者每次创建新的obj?

    public static CycleManager Instance
    {
        get
        {
            return instance;
        }

    }

Alfah

2 个答案:

答案 0 :(得分:1)

您实际上并未在RootFrame_Navigating方法中访问get属性。你直接命中静态字段(它被声明为public)

public sealed class CycleManager
{
   public static readonly CycleManager instance = new CycleManager();

...

CycleManager pCycMan = CycleManager.instance;

我认为您打算键入CycleManager.Instance(使用大写'i')

答案 1 :(得分:0)

如果查看static field initialization

的C#规范
  

[...]静态字段初始值设定项在a处执行   在第一次使用静态字段之前依赖于实现的时间   那个班级

因此,命中断点的顺序与规范一致,换句话说,静态字段在运行时确定的某个时间初始化。但是,确切的时间并不详细。您不应该编写依赖于静态字段的初始化顺序的代码。

您的第二个问题是您正在访问该字段,而不是属性instanceInstance。您应该将静态字段设为私有。