Приложение UWP C++, передающее класс OpenCV между страницами

на самом деле я пишу приложение C++/CX для универсальной платформы Windows. Я пытаюсь передать класс с различными переменными, которые не являются частью среды выполнения Windows (например, cv::detail::WaveCorrectKind и std::string) от одного элемента страницы к другому. Непосредственно передать его в методе Navigate-как объект невозможно. Написать его во внешнем классе и сделать его доступным для других элементов страницы также невозможно, потому что это дает мне некоторые ошибки, когда я пытаюсь использовать некоторые переменные nonWinRT или классы в публичном разделе для доступа из других элементов страницы. Вот пример кода того, что я хотел бы иметь.

Заголовок Страницы1:

//Page1.h
// Deklaration der Page1-Klasse

#pragma once

#include "Page1.g.h"
#include "Bibliothek.h"

namespace eigeneApp
{
    [Windows::Foundation::Metadata::WebHostHidden]
    public ref class Page1 sealed
    {
    public:
        Page1();

    protected:
        //Navigations Events
        virtual void OnNavigatedTo(Windows::UI::Xaml::Navigation::NavigationEventArgs^ e) override;
        virtual void OnNavigatingFrom(Windows::UI::Xaml::Navigation::NavigatingCancelEventArgs^ e) override;    

    private:
        //Buttons Begin
        void toPage2Button_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e);
        //some other Buttonevents for capturing Photos and back to mainpage
        //Buttons Ende
        //A OpenCV related Element out of the Bibliothek.h
        bibitem bibitemElement;

        //Tasks that handle some stuff out of Bibliothek.h (photo processing) and capturing the photos asynchronous 
        // String Helper for Converting Platform::String to std::string and back    
    };
}

Cpp-файл Страницы1:

//
// Page1.xaml.cpp
// Implementing Page1-Klasse
//

#include "pch.h"

#include "Page1.xaml.h"
#include "Page2.xaml.h"
//other includes for asynch programming, Strings and so on...
#include "Bibliothek.h"
#include "opencv2opencv.hpp"
#include "opencv2imgproc.hpp"

#include "App.xaml.h"

using namespace eigeneApp;//and other using namespaces

Page1::Page1() 
{
    InitializeComponent();  
}

//Buttons Start
void eigeneApp::Page1::toPage2Button_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
    this->Dispatcher->RunAsync(Windows::UI::Core::CoreDispatcherPriority::Normal, ref new Windows::UI::Core::DispatchedHandler([this]() {
        this->Frame->Navigate(Windows::UI::Xaml::Interop::TypeName(Page2::typeid),bibitemElement);
    }));
}
// other Button-functions are also here, but not relevant
//Tasks and the NavigationEvents are handled here and the String Helpers

Насколько я знаю библиотек.h содержит класс (bibitem) с функциями, связанными с openCV. Невозможно разместить код библиотеки.h. Но я также попытался передать cv:: Mat между страницами, это не сработало.

Я также попытался написать класс, который содержит статический bibitem и попытался использовать их в Page1 и Page2, чтобы получить содержимое от Page1 к Page2. Вот код:

#pragma once

#include "Bibliothek.h"

//NavigationData.h
class NavigationData
    {
    public:
       static bibitem passingbibitem;
    };

И:

//NavigationData.cpp
#include "NavigationData.h"
#include "pch.h"

bibitem NavigationData::passingbibitem;

После этого я добавил элемент NavigationData к каждой из страниц частного раздела и попытался использовать их. Функции passingbibitem были использованы на странице 1, но по мере того, как я прихожу на страницу 2, Данные passingbibitem пусты. Так что мой статический отдых тот же thougt был каким-то неправильным…

Существуют ли способы передачи не WinRT классов и переменных между страницами? И может кто-нибудь дать мне пример того, как это сделать?

Я забыл функцию, которая устанавливает bibitem-data по умолчанию
значения в My OnNavigatingFrom-обработчике. Теперь кажется, что работает с
статический элемент в отдельном классе. Но если кто-то знает любой другой способ
передавая данные, не стесняйтесь размещать их здесь

1 ответ

  1. Типы, передаваемые в функцию навигации, должны быть типами среды выполнения (производными от Platform::Object^), что означает, что они должны быть типами ‘ref class’. Идея создания типа оболочки верна, но проблема в том, что открытые поля/свойства должны быть выражаемы в WinRT, поэтому они не могут быть типами C++.

    Ответ заключается в том, что вы можете сделать класс оболочки, вам просто нужно пометить их как внутренние. Я бы не сделал его статическим, потому что это было бы одинаково во всех экземплярах типа оболочки, просто сделайте его переменной экземпляра:

    //NavigationData.h
    ref class NavigationData
    {
        internal:
           bibitem passingbibitem;
    };