Почему этот элемент не найден?

Я добавил код в свой проект приложения Магазина Windows, чтобы использовать панель "Настройки" для пользовательских настроек приложения. Я основал этот код на том, что написано в книге Адама Натана "Приложения для Windows 8 с XAML и C#", начиная с p. 503.

У меня есть этот код в App.xaml.cs:

public App()
{
    this.InitializeComponent();
    this.Suspending += OnSuspending;
    SettingsPane.GetForCurrentView().CommandsRequested += OnCommandsRequested;
    UnhandledException += Application_UnhandledException;
}

private void OnCommandsRequested(SettingsPane sender, SettingsPaneCommandsRequestedEventArgs spcreArgs)
{
    spcreArgs.Request.ApplicationCommands.Add(new SettingsCommand(1, "App Bar Color", OnSettingsCommand));
    spcreArgs.Request.ApplicationCommands.Add(new SettingsCommand(2, "Visit Types to Display", OnSettingsCommand));
    spcreArgs.Request.ApplicationCommands.Add(new SettingsCommand(3, "Display Current Location", OnSettingsCommand));
    spcreArgs.Request.ApplicationCommands.Add(new SettingsCommand(4, "Set Home Base", OnSettingsCommand));
}

private void OnSettingsCommand(Windows.UI.Popups.IUICommand command)
{
    int id = (int) command.Id;
    switch (id)
    {
        case 1:
            //Bla => I think this is where I need to add "this.[custom settings pane (user control) name].Show(command)
            break;
        case 2:
            //Bla
            break;
        case 3:
            //Bla
            break;
        case 4:
            //Bla
            break;
    }
}

... но происходит сбой в строке "SettingsPane.GetForCurrentView (). CommandsRequested + = OnCommandsRequested;" с:

System.Exception was unhandled by user code
  HResult=-2147023728
  Message=Element not found. (Exception from HRESULT: 0x80070490)
  Source=Windows.UI
  StackTrace:
       at Windows.UI.ApplicationSettings.SettingsPane.GetForCurrentView()
       at Visits.App..ctor()
       at Visits.Program.<Main>b__0(ApplicationInitializationCallbackParams p)
  InnerException:

Когда я просматриваю подробную информацию об исключении, я вижу:

В чем здесь проблема?

1 ответ

Решение

В твоем случае SettingsPane.GetForCurrentView() создает исключение, потому что вы называете это слишком рано. Вы настраиваете параметры для определенного представления, но в конструкторе приложения еще нет представления, следовательно Element not found,

Переместите свой код на страницу, ничего не меняя, и он будет работать:

public MainPage()
{
    this.InitializeComponent();
    SettingsPane.GetForCurrentView().CommandsRequested += OnCommandsRequested;
}

private void OnCommandsRequested(SettingsPane sender, SettingsPaneCommandsRequestedEventArgs spcreArgs)
{
    spcreArgs.Request.ApplicationCommands.Add(new SettingsCommand(1, "App Bar Color", OnSettingsCommand));
    spcreArgs.Request.ApplicationCommands.Add(new SettingsCommand(2, "Visit Types to Display", OnSettingsCommand));
    spcreArgs.Request.ApplicationCommands.Add(new SettingsCommand(3, "Display Current Location", OnSettingsCommand));
    spcreArgs.Request.ApplicationCommands.Add(new SettingsCommand(4, "Set Home Base", OnSettingsCommand));
}

private void OnSettingsCommand(Windows.UI.Popups.IUICommand command)
{
    int id = (int)command.Id;
    switch (id)
    {
        case 1:
            //Bla => I think this is where I need to add "this.[custom settings pane (user control) name].Show(command)
            break;
        case 2:
            //Bla
            break;
        case 3:
            //Bla
            break;
        case 4:
            //Bla
            break;
    }
}
Другие вопросы по тегам