2016-10-04 3 views
0

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

заголовке Page1:

//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  
    }; 
} 

СРР-файл Page1:

// 
// 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 "opencv2\opencv.hpp" 
#include "opencv2\imgproc.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 

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

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

#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 элемент для каждой из страниц приватной секции и пытались использовать их. Проходящие бибитем-функции можно было использовать на странице, но по мере того, как я нахожусь в Data of passbibitem, пусто. Таким образом, мой статический остается тем же самым, что и у вас ...

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

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

+1

C++/CX является надмножеством C++. Просто передайте свои объекты, как если бы вы проходили вокруг любого другого объекта C++. Если вы хотите по-настоящему представить себя, заверните их в класс 'ref' и получите бесплатное управление ресурсами. Но без кода мы не можем помочь. – IInspectable

ответ

0

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

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

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

Благодарим вас за эту идею, но если я попытаюсь написать заголовок с «internal:» - specifier, это даст мне некоторые ошибки. Похоже, что невозможно использовать спецификатор «internal:» в обычном классе C++. С помощью класса «ref» можно использовать спецификатор «internal:».Но когда я пытаюсь, Visual Studio бросает 3 ошибки компилятора: C2664, C3073 и C3076. Один из них заключается в том, что преобразование между моим классом и объектом невозможно, другие - о конструкторе копирования, а что-то о экземпляре типа ref не может быть занесено в системный род ... – Henji

+0

Извините - класс прокладки NavigationData должен быть классом 'ref'. Можете ли вы представить более полный пример, показывающий ошибки компилятора и полный вывод компилятора? Я не могу понять, что ваша проблема будет основана только на кодах ошибок. –

Смежные вопросы