C# 是否从“设置”弹出按钮更新2个不同的类?
根据MSDN指南,我们需要将应用程序的所有设置放入设置span,然后应用程序应在应用设置时更新所有页面 在我的应用程序中,我需要有一个重置选项,将应用程序设置为默认设置。按下重置按钮时,我需要更新Calendar.xaml和HistoryStatistics.xaml这两个页面。应用程序的所有数据都放在一个名为CycleManager的单例类中。我使用了Callisto工具箱中的SettingsFlyout控件 App.XamlC# 是否从“设置”弹出按钮更新2个不同的类?,c#,windows-8,settings,flyout,C#,Windows 8,Settings,Flyout,根据MSDN指南,我们需要将应用程序的所有设置放入设置span,然后应用程序应在应用设置时更新所有页面 在我的应用程序中,我需要有一个重置选项,将应用程序设置为默认设置。按下重置按钮时,我需要更新Calendar.xaml和HistoryStatistics.xaml这两个页面。应用程序的所有数据都放在一个名为CycleManager的单例类中。我使用了Callisto工具箱中的SettingsFlyout控件 App.Xaml public HistoryStatistics() {
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
}
}
现在问题来了
这个问题很长。希望大家都理解这个场景和问题。由于没有使用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中取消订阅 这样,只有其中一个实际执行清理