Почему объявление переменной вызывает исключение? - PullRequest
0 голосов
/ 31 января 2019

Исключение выдается при объявлении переменной, объявленной как глобальная для модуля перевода.

Сообщество Visual Studio 2017, версия 15.9.5, с установленным расширением C ++ / WinRT.Проект был запущен из шаблона «Пустое приложение (C ++ / WinRT)».

Я хочу, чтобы переменный массив SolidColorBrush myBrushes[2]; использовался глобально только в одной единице перевода. Он объявлен в пространстве имен переводаunit.

Я попытался полностью определить тип, пометив тип как static и попробовав его без указания массива.

#include "pch.h"
#include "MainPage.h"
//#include <winrt/Windows.UI.Xaml.Media.h>

using namespace winrt;
using namespace Windows::UI::Xaml;
using namespace Windows::UI::Xaml::Input;
using namespace Windows::UI::Xaml::Media;


//*************************************************************************************************
namespace winrt::event_Experiment::implementation
{

    //*************************************************************************************************
    //Windows::UI::Xaml::Media::SolidColorBrush myBrushes[2];
    //static SolidColorBrush myBrushes[2];
    SolidColorBrush myBrushes[2];

    //*************************************************************************************************
    MainPage::MainPage()
    {
        InitializeComponent();

        //myBrush.Color(Windows::UI::Colors::Blue());
        //myBrush[1].Color(Windows::UI::Colors::Red());

        //myStackPanel().Background() = myBrush;

        //SolidColorBrush tempBrush = SolidColorBrush(winrt::Windows::UI::Colors::Blue());
        //myBrush(tempBrush);

        myButton2().Click({ this, &MainPage::ClickHandler2 });
        myStackPanel().PointerPressed({ this, &MainPage::spPointerPressed });

        //myBrushes[0].Color(Windows::UI::Colors::Blue());
        //myBrushes[1].Color(Windows::UI::Colors::Red());

    }

Исключение показано на рисунке ниже. enter image description here

Заявление, сделанное Microsoft в мае 2018 года, объявив об обновлении C ++ / WinRT, заключается в том, что это прямой C ++ 17, который допускает такое объявление.

Как мне заставить это работать? Спасибо.

1 Ответ

0 голосов
/ 31 января 2019

"Заявление Microsoft в мае 2018 года об объявлении об обновлении C ++ / WinRT заключается в том, что это прямое C ++ 17, которое допускает такое объявление."

C ++/ WinRT - это стандартный C ++ 17, а в качестве стандартной библиотеки C ++ конструктор типа может выдать исключение, указывающее, что вы используете его неправильно.В этом случае конструктор терпит неудачу, потому что SolidColorBrush может быть создан только в потоке пользовательского интерфейса Xaml.Как отметил Рэймонд в своем комментарии, вы должны убедиться, что Xaml инициализирован перед созданием ресурсов Xaml.Один из способов сделать это - использовать конструктор nullptr, чтобы отложить конструкцию на потом.Например:

SolidColorBrush brush{ nullptr };

Затем вы можете назначить значение кисти, когда вы хорошо и готовы.

brush = SolidColorBrush(...);
...