【问题标题】:How to subscribe to an event in a windows 8 settings panel (c#)如何在 Windows 8 设置面板中订阅事件(c#)
【发布时间】:2013-01-24 19:15:11
【问题描述】:

我正在用 c#/xaml 开发一个 Windows 8 商店应用程序。 Windows 商店指南说,当用户更改设置时,应用程序应立即反映该更改。我需要帮助弄清楚如何做到这一点。

以下是有关我的设置的一些详细信息。

我创建了一个名为 OptionsView 的自定义控件:

public partial class OptionsView : UserControl
{
    public OptionsView()
    {
        this.InitializeComponent();
    }

    private void cmbEarliestYear_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        ApplicationDataContainer roamingSettings = Windows.Storage.ApplicationData.Current.RoamingSettings;
        roamingSettings.Containers["appOptions"].Values["earliestYear"] = cmbEarliestYear.SelectedValue.ToString();
    }
}

在我的 App.xaml.cs 类中,我使用 Callisto 库中的 SettingsFlyout 在用户单击选项链接时显示自定义选项控件:

protected override void OnWindowCreated(WindowCreatedEventArgs args)
{
    base.OnWindowCreated(args);
    SettingsPane.GetForCurrentView().CommandsRequested += onCommandsRequested;
}

void onCommandsRequested(SettingsPane settingsPane, SettingsPaneCommandsRequestedEventArgs eventArgs)
{
    UICommandInvokedHandler optionsHandler = new UICommandInvokedHandler(onOptionsClick);
    SettingsCommand optionsCommand = new SettingsCommand("options", "Options", optionsHandler);
    eventArgs.Request.ApplicationCommands.Add(optionsCommand);

}

void onOptionsClick(IUICommand command)
{
    SettingsFlyout settings = new SettingsFlyout();
    settings.FlyoutWidth = SettingsFlyout.SettingsFlyoutWidth.Narrow;
    settings.HeaderText = "Options";
    settings.Content = new OptionsView();
    settings.IsOpen = true;
}

我的应用程序中有一个名为 CreateTripPage 的页面。该页面上有一个组合框,允许用户更改旅行的年份。该组合框中的最早年份需要根据用户在选项中设置的值进行更改。因此,当用户在 CreateTripPage 打开时更改 OptionsView 中 cmbEarliestYear 的值时,我需要一个事件来触发。我不知道如何触发/订阅所需的事件。

任何帮助将不胜感激。

【问题讨论】:

    标签: c# windows-8


    【解决方案1】:

    这是我实现的类似行为的一个简单示例。 Cineworld 应用程序可用于查看有关英国和爱尔兰的电影院/电影的详细信息。

    设置窗格中的选项页面,允许选择/修改区域。这意味着我的应用需要在运行时适应区域修改。

    我倾向于这样做:

    1) 拥有一个定义属性并保留这些值的配置类。 2) config 类公开一个属性

    public static event Action RegionChanged = delegate { };
    

    3) 在 Region 属性的 setter 中触发事件。

    if (RegionChanged != null)
        RegionChanged();
    

    4) 现在在 MainPage.xaml.cs 或主应用入口点。

    protected async override void OnNavigatedTo(NavigationEventArgs e)
    {
        Config.RegionChanged -= Config_RegionChanged;
        Config.RegionChanged += Config_RegionChanged;
    
        // do whatever else you need to do (initial data load)
    
        base.OnNavigatedTo(e);
    }
    
    async void Config_RegionChanged()
    {
        bLoaded = false;
        this.GoHome(this, new RoutedEventArgs());
    }
    

    原来如此。

    【讨论】:

    • 如果您想更改两页而不是一页怎么办?我们应该在两个类中注册事件吗?
    • 在任何时候,您都只会加载一个 xaml 页面。对于第二页,您无论如何都应该检查/验证页面加载行为并且不需要重新加载?
    • 如果您不介意,可以看看我发布的问题。我已经解释了这个场景。 stackoverflow.com/questions/16715179/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    • 2020-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多