Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否从“设置”弹出按钮更新2个不同的类?_C#_Windows 8_Settings_Flyout - Fatal编程技术网

C# 是否从“设置”弹出按钮更新2个不同的类?

C# 是否从“设置”弹出按钮更新2个不同的类?,c#,windows-8,settings,flyout,C#,Windows 8,Settings,Flyout,根据MSDN指南,我们需要将应用程序的所有设置放入设置span,然后应用程序应在应用设置时更新所有页面 在我的应用程序中,我需要有一个重置选项,将应用程序设置为默认设置。按下重置按钮时,我需要更新Calendar.xaml和HistoryStatistics.xaml这两个页面。应用程序的所有数据都放在一个名为CycleManager的单例类中。我使用了Callisto工具箱中的SettingsFlyout控件 App.Xaml public HistoryStatistics() {

根据MSDN指南,我们需要将应用程序的所有设置放入设置span,然后应用程序应在应用设置时更新所有页面

在我的应用程序中,我需要有一个重置选项,将应用程序设置为默认设置。按下重置按钮时,我需要更新Calendar.xaml和HistoryStatistics.xaml这两个页面。应用程序的所有数据都放在一个名为CycleManager的单例类中。我使用了Callisto工具箱中的SettingsFlyout控件

App.Xaml

public HistoryStatistics()
    {
        CycleManager pCycMan = CycleManager.Instance;
        pCycMan.ResetClicked += this.ResetClicked;
    }
已在App.xaml中注册设置

SettingsPane.GetForCurrentView().CommandsRequested += OnCommandsRequested;
并在
OnCommandsRequested
函数中创建重置处理程序

        var reset = new SettingsCommand("reset", "Reset", (handler) =>
        {
            var settings = new SettingsFlyout();
            settings.Content = new ResetUserControl();
            settings.HeaderBrush = new SolidColorBrush(_background);
            settings.Background = new SolidColorBrush(_background);
            settings.HeaderText = "Reset";
            settings.IsOpen = true;
        });

        args.Request.ApplicationCommands.Add(reset);
CycleManager.cs

在CycleManager类中,有一个m_Reset变量、它的setter和getter以及一个名为ResetClicked的事件处理程序

    public event EventHandler ResetClicked;

    public bool Reset
    {
        get
        {
            return m_reset;
        }
        set
        {
            m_reset = value;
            if (ResetClicked != null)
                ResetClicked(this, EventArgs.Empty);
        }
    }
接下来是我在第一个类calendar.xaml中关联此处理程序的部分

Calendar.xaml

public HistoryStatistics()
    {
        CycleManager pCycMan = CycleManager.Instance;
        pCycMan.ResetClicked += this.ResetClicked;
    }
在类的构造函数中,我声明事件处理程序

CycleManager pCycMan = CycleManager.Instance;
pCycMan.ResetClicked += this.ResetClicked;
    private async void ResetClicked(object sender, EventArgs e)
    {
        CycleManager pCycMan = CycleManager.Instance;
        if (pCycMan.Reset == true)
        {
            try
            {                   
                await Windows.Storage.ApplicationData.Current.ClearAsync(Windows.Storage.ApplicationDataLocality.Local);
                pCycMan.InitializeValues();
            }
            catch (Exception)
            {
            }
        }

        CreateCalendar();// UI is loaded
    }  
后面是事件处理程序的定义

CycleManager pCycMan = CycleManager.Instance;
pCycMan.ResetClicked += this.ResetClicked;
    private async void ResetClicked(object sender, EventArgs e)
    {
        CycleManager pCycMan = CycleManager.Instance;
        if (pCycMan.Reset == true)
        {
            try
            {                   
                await Windows.Storage.ApplicationData.Current.ClearAsync(Windows.Storage.ApplicationDataLocality.Local);
                pCycMan.InitializeValues();
            }
            catch (Exception)
            {
            }
        }

        CreateCalendar();// UI is loaded
    }  
在HistoryStatistics.xaml的构造函数中,我做了与上面相同的事情

历史统计.xaml

public HistoryStatistics()
    {
        CycleManager pCycMan = CycleManager.Instance;
        pCycMan.ResetClicked += this.ResetClicked;
    }
定义

    private void ResetClicked(object sender, EventArgs e)
    {
        CycleManager pCycMan = CycleManager.Instance;
        if (pCycMan.Reset == true)
        {
            await Windows.Storage.ApplicationData.Current.ClearAsync(Windows.Storage.ApplicationDataLocality.Local);
            pCycMan.InitializeValues();
            LoadListView();// loads the UI
            DisplayStatistics();//loads the UI for the page
        }
    } 
现在问题来了

  • 这是正确的方法吗

  • 当在第二页(HistoryStatistcs)的第一页中按Reset时,首先调用在第一页(Calendar.xaml.cs)中声明的Reset clicked函数,然后调用HistoryStatistics中的函数。并且两者都是异步执行的!:( 这是正确的行为吗


  • 这个问题很长。希望大家都理解这个场景和问题。

    由于没有使用MVVM(模型、视图和视图模型),可能会出现复杂性/混乱分离。你可能想了解这一点。保持分离有帮助。下面是一些关于这一点的提示。但不一定是你的应用程序的完整设计

    在本例中:CycleManager.Instance为模型(数据)提供服务。您可能希望将ResetClicked重命名为SettingChanged,并将该事件视为通知客户端已公开的一个或多个设置属性已更改。它还应公开ResetUserControl可调用的ResetSettings()方法

    // model for the settings
    class SettingsManager
    {
        public event EventHandler SettingsChanged;
    
        public async void ResetSettings()
        {
            await Windows.Storage.ApplicationData.Current.ClearAsync
                  (Windows.Storage.ApplicationDataLocality.Local);
            // initialize all values to default values;
            this._intializeValues();
            if (this.SettingsChanged != null)
                this.SettingsChanged(this, EventArgs.Empty);
        }
    }
    
    HistoryStatistics和Calendar类应具有视图模型,该模型应侦听设置更改事件并更新公开的属性。每个页面视图(xaml)绑定到各自视图模型公开的属性。这将需要对当前代码进行一些重构

    否则,ResetClick事件处理程序可以更改为SettingChanged事件处理程序并执行所需操作。它们不需要调用setting mgr来初始化值

    class HistoryStatistics
    {
        private void SettingsChanged(object sender, EventArgs e)
        {
            SettingsManager settingsManager = SettingsManager.Instance;
            LoadListView();// loads the UI
            DisplayStatistics();//loads the UI for the page
        } 
    }
    

    HTH.

    您概述的行为没有问题。两个页面订阅一个事件,事件使用多播委托,这意味着它们都将被解雇

    我认为您需要一个更简单的行为。每个xaml页面都应该在OnNavigatedTo上订阅该事件,并且应该在OnNavigatedFrom中取消订阅

    这样,只有其中一个实际执行清理