powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Проблема наследования страниц Page в Silverlight
12 сообщений из 12, страница 1 из 1
Проблема наследования страниц Page в Silverlight
    #38440909
multiuser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ребят, всем здравствуйте!

Для своего приложения на Silverlight, я недавно столкнулся с необходимостью наследования общей функциональности от страницы (Page).

В XAML это:
<navigation:Page
................
xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
................

Похожая тема уже обсуждалась на этом форуме здесь http://www.sql.ru/forum/918901/contentcontrol-vmesto-nasledovaniya
Кроме того, да есть немного информации если хорошо погуглить наподобии вот этого http://www.gotdotnet.ru/forums/17/135862/


Проблема состоит в том, что в моём проекте используются не UserControl от которых можно было бы отказаться (перейдя как вы писали к ContentControl), а так же слегка поработав над XAML разметкой, добиться таки того что хочется. В моём случае речь идёт о проекте рабочей интерактивной карты состоящей из нескольких страниц которые представляют собой отдельные карты, и базовой страницы. Поэтому хотелось бы не дублировать логику для каждой страницы.

Естественно я начинаю делать что-то такое - в качестве общего предка на стороне C#

public abstract partial class DetalizationPage : Page, IRailwayFrontsCollectionIncludable, IRailwayRoadsCollectionIncludable, IRailwayEntityDataIncludable //класс общей организации интерфейса необходимой страницы детализации требуемой станции
{
//контекст доступа к данным из базы по средствам инициализируемой модели данных
protected DataCommunicationDomainContext GlobalEntityContext = new DataCommunicationDomainContext();
protected DomainDataSource MySource_CommonWagonInformation = new DomainDataSource();
protected DomainDataSource MySource_CommonCommonRailwayFrontInformation = new DomainDataSource();
protected DomainDataSource MySource_CommonCommonRailwayRoadInformation = new DomainDataSource();
.......................................
...............................

а затем для своих страниц карт наследую их от DetalizationPage

public partial class StationPromishlennayaPage : DetalizationPage //класс организации интерфейса страницы детализации станции Промышленная
{

при этом естественно компилятор тут же ругается на разностное определение типа, которое я пытаюсь описать в XAML коде...

но нужный мне, создаваемый общий тип страницы - "DetalizationPage" описывается в XAML вот так

<navigation:Page
xmlns=" http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x=" http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d=" http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc=" http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
xmlns:dxe=" http://schemas.devexpress.com/winfx/2008/xaml/editors"
x:Class="STZ_Silverlight_Web_Map_Component.DetalizationPage"


и когда я пытаюсь уже для каждой конкретной страницы на стороне XAML определить их как потомков от DetalizationPage (которая является navigation:Page), ничего не получается.

Подскажите пожалуйста, можно ли это реализовать вообще? Или всё таки нет? Спасибо
...
Рейтинг: 0 / 0
Проблема наследования страниц Page в Silverlight
    #38441505
Фотография EDUARD SAPOTSKI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По моему Вы слишком увлеклись наследованием. В чем сокральный смысл наследования от Page? Используйте Page как контейнер в котором размещайте свои юзер-контролы.
...
Рейтинг: 0 / 0
Проблема наследования страниц Page в Silverlight
    #38442426
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
multiuser,

если XAML-часть базовой страницы не нужна (т.е. можно обойтись без нее), то проблем с наследованием вообще никаких не должно быть, а вот если нужна, тогда есть несколько нюансов...
...
Рейтинг: 0 / 0
Проблема наследования страниц Page в Silverlight
    #38443058
multiuser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LR, ну пробовал конечно делать и проще - тоесть на самом деле создавать обычный класс C#, а не страницу Page, и просто указывать что это потомок от Page. вот так:

public abstract class CommonDetalizationPage : Page, IRailwayFrontsCollectionIncludable, IRailwayRoadsCollectionIncludable, IRailwayEntityDataIncludable //класс общей организации интерфейса необходимой страницы детализации требуемой станции

или для простоты так: public class CommonDetalizationPage : Page

описываем всё что можно по максимуму в CommonDetalizationPage

и это работает, но только при описании самого класса. однако при попытке свои страницы карт объявить потомками CommonDetalizationPage в XAML части моих страниц - всё равно требуется описание этих страниц как Page. а при попытке и там описать их как CommonDetalizationPage, опять ничего не работает с сообщением о невозможности создания объекта CommonDetalizationPage (не абстрактного)

в варианте создания базового класса как страницы - Page (c собственной доступной для пользователя XAML частью), вот таким образом:

public partial class DetalizationPage : Page, IRailwayFrontsCollectionIncludable, IRailwayRoadsCollectionIncludable, IRailwayEntityDataIncludable //класс общей организации интерфейса необходимой страницы детализации требуемой станции
{
///////////////////////////////////////////////////////////////////////////
//ДИНАМИЧЕСКИЕ РАБОЧИЕ ПОЛЯ УРОВНЯ ВНЕШНЕГО КОНТЕНТА//
///////////////////////////////////////////////////////////////////////////
protected DataCommunicationDomainContext GlobalEntityContext = new DataCommunicationDomainContext();
protected DomainDataSource MySource_CommonWagonInformation = new DomainDataSource();
protected DomainDataSource MySource_CommonCommonRailwayFrontInformation = new DomainDataSource();
protected DomainDataSource MySource_CommonCommonRailwayRoadInformation = new DomainDataSource();

то у меня почти получилось это сделать

public partial class StationPromishlennayaPage : DetalizationPage //класс организации интерфейса страницы детализации станции Промышленная
{
///////////////////////
/////////////////////


, немного помучившись с XAML частью с вот такими изменениями в XAML:

<MainSpace:DetalizationPage
xmlns:MainSpace="clr-namespace:STZ_Silverlight_Web_Map_Component"
xmlns=" http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x=" http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d=" http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc=" http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:navigation="namespace:MainSpace;assembly=STZ_Silverlight_Web_Map_Component"
x:Class="STZ_Silverlight_Web_Map_Component.StationPromishlennayaPage"
mc:Ignorable="d"
Width="800" Height="600"
d:DesignWidth="800" d:DesignHeight="600"
Title="Схема станции Промышленная">
/////////////////
//////////////////////

но всё равно происходит исключение при работе IDE которое выглядит так:

An Exception was thrown. Exception: Cannot create an instance of "DetalizationPage".

тоесть почему то нехочет в упор создавать объект типа DetalizationPage

других ошибок нет
...
Рейтинг: 0 / 0
Проблема наследования страниц Page в Silverlight
    #38443075
multiuser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
EDUARD SAPOTSKI, в данном случае мне это на самом деле необходимо. дело в том, что у меня проект интерактивной карты подъездных путей на станциях одного предприятия. но станций несколько (в данном случае 5). и каждая из них масштабируется, двигается, несёт в себе кучу семантической информации, с возможностью ткнув скажем на какую-то часть карты - получать определённую информацию из БД об этом объекте на карте. по сути - вся логика практически универсальна и одинакова для всех карт. инструменты навигации (кнопочки - приблизить/отдалить там и т.д.) - тоже одинаковые везде. а различно в принципе только графическое наполнение которое представляет собой картинки в качестве подложек. поэтому конечно писать постоянно для каждой станции всё в отдельной странице - дело совершенно неблагодарное ((
...
Рейтинг: 0 / 0
Проблема наследования страниц Page в Silverlight
    #38443575
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
multiuser,

Набросал для Вас примерчик (проект vs2010 прилагается), для обоих случаев - Base1 без xaml-части, Base2 с xaml. В последнем случае нюансы в том, что, во-первых, надо определиться куда размещать xaml-содержимое страницы-наследницы (в примере это ContentStuff как содержимое Border-а), во-вторых, возникает нюанс с использованием обработчиков событий базового класса (в примере см. Button_Click). Вполне вероятны и другие "особенности" такого наследования, с которыми я не сталкивался (в моих проектах базовые странички без xaml-части)
...
Рейтинг: 0 / 0
Проблема наследования страниц Page в Silverlight
    #38444444
multiuser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LR, вчера удалось всё сделать самостоятетельно, по принципу - без XAML части. уже всё работало почти как надо. пришлось завиртуалить большинство методов, но однако большую часть удалось таки перенести в общего предка. хотел написать что всё - ничего не надо.

но сегодня обновили нам компоненты DevExpress, пришлось делать очередной апгрейд библиотек, и опять всё рухнуло. щас опять в xaml коде пишет - немогу создать экземпляр типа CommonDetalizationPage. вот мучаюсь опять.

вариант с визуальным наследованием именно от Page довёл вчера почти до рабочего состояния но та одна ошибка всё равно висит.

щас буду смотреть ваши примеры. спасибо!
...
Рейтинг: 0 / 0
Проблема наследования страниц Page в Silverlight
    #38444932
multiuser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LR, примеры посмотрел спасибо! мало того буквально 1 в 1 всё.

Ваш базовый предок в варианте 1

<my:Base1 x:Class="SilverlightApplication1.Page11"
xmlns:my="clr-namespace:SilverlightApplication1"
xmlns=" http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x=" http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d=" http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc=" http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
d:DesignWidth="640" d:DesignHeight="480"
Title="Page-1-1">

.............
.......................
..............
........

</my:Base1>

Мой базовый предок в варианте 1

<MainSpace:CommonDetalizationPage x:Class="STZ_Silverlight_Web_Map_Component.StationPromishlennayaPage"
xmlns:MainSpace="clr-namespace:STZ_Silverlight_Web_Map_Component"
xmlns=" http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x=" http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d=" http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc=" http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
Width="800" Height="600"
d:DesignWidth="800" d:DesignHeight="600"
Title="Схема станции Промышленная">

.............................
.................
.........
......

</MainSpace:CommonDetalizationPage>



В XAML разметке в данном случае всё одинаково. Именно в таком варианте оно работало вчера. После обновления компонент DevExpress - начало валиться при инициализации страницы потомка. А в xaml разметке страницы потомка (StationPromishlennayaPage) которая вкратце описана выше - перестаёт отображаться вся страница, с выводом исключения - Cannot create an instance...... (немогу мол создать страницу (то есть - StationPromishlennayaPage) типа CommonDetalizationPage)
...
Рейтинг: 0 / 0
Проблема наследования страниц Page в Silverlight
    #38445378
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
multiuser,
т.е., после обновления компонент DevExpress, проект компилируется нормально?
"начало валиться при инициализации страницы потомка" - это в рантайме? а какая ошибка?
...
Рейтинг: 0 / 0
Проблема наследования страниц Page в Silverlight
    #38446061
multiuser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LR, на этапе выполнения валится уже после отработки всех инициализаторов полей и конструктора базового типа - при возврате к конструктору потомка - на 1-м же вызове из него InitializeComponent();

если его комментнуть - валиться не будет.

public partial class StationPromishlennayaPage : CommonDetalizationPage //класс организации интерфейса страницы детализации станции Промышленная
{
public StationPromishlennayaPage() : base () //на перегрузку конструктора экземпляров данного типа
{
this.InitializeComponent(); //на вызов логики инициализации компонент текущей страницы приложения

this.MySource_CommonCommonRailwayFrontInformation.Load();
this.MySource_CommonCommonRailwayRoadInformation.Load();
this.FirstParameter.Value = 36;
this.MySource_CommonWagonInformation.Load();
}

то есть визуальные компоненты он не может инициализировать. и не мудрено - при переходе к уже ненавистной мне xaml части - он снова перестаёт отрисовывать содержимое xaml разметки страницы и выводит аналогичное прежнему исключение -Cannot create an instance of "CommonDetalizationPage".

код разметки тот же:

<MainSpace:CommonDetalizationPage x:Class="STZ_Silverlight_Web_Map_Component.StationPromishlennayaPage"
xmlns:MainSpace="clr-namespace:STZ_Silverlight_Web_Map_Component"
xmlns=" http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x=" http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d=" http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc=" http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
Width="800" Height="600"
d:DesignWidth="800" d:DesignHeight="600"
Title="Схема станции Промышленная">
...
Рейтинг: 0 / 0
Проблема наследования страниц Page в Silverlight
    #38446465
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
multiuserна этапе выполнения валится уже после отработки всех инициализаторов полей и конструктора базового типа - при возврате к конструктору потомка - на 1-м же вызове из него InitializeComponent();Используйте отладчик и посмотрите более детально что за ошибка - InnerException, StackTrace...
...
Рейтинг: 0 / 0
Проблема наследования страниц Page в Silverlight
    #38446708
multiuser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уже сделал.

Кратко - проблема в данных получаемых через WCF RIA. Проблема решена!


Подробно - ситуация следующая:

Даже без запуска программы - сама часть xaml не позволяла создать и отрисовать экземпляр страницы потомка, и выдавала исключение про которое я писал. Это было ожидаемо поскольку при работе в разметке xaml, IDE пытается тут же отрисовать будующую страницу, для чего уже тогда пытается создать такой объект. Однако опираясь на свою вторую половинку - часть C# (в которой никаких ошибок на первый взгляд не обнаруживается во всяком случае до рантайма...) она пытается исполнить заложенную в ней логику что приводит к неинформативному сообщению об ошибке - cannot create an instance..... И казалось бы почему - пойди пойми...

Углубляясь в последовательность вызовов из которых произошла генерация исключения, раскрываю всё подряд на InnerException и нахожу корень проблемы ))) - У меня же данные грузятся из БД (через WCF RIA) по средствам EntityFramework...

Так вот: Пытаясь начать (пусть даже не загрузку самих данных типа "this.MySource_CommonWagonInformation.Load();" - которую я конечно делал всегда только в потомке, и только после инициализации страницы) а даже всего лишь инициализацию объектов хранения контента данных вот такого вида this.MySource_CommonWagonInformation.DomainContext = this.GlobalEntityContext;

- программа немогла корректно проинициализирровать и присвоить DomainContext источника типа DomainDataSource, раньше загрузки самого объекта типа DomainContext - this.GlobalEntityContext.Load<..................>();

- как и описывалось всегда......

//на загрузку процедуры получения данных о вагонах из БД через логику WCF RIA
this.GlobalEntityContext.Load<DataCommunicationSystem.GetNACommonWagonInformation_Result>(this.GlobalEntityContext.GetNACommonWagonInformation_ImportQuery(36, 0, 0, DateTime.Now.ToString()));
//на привязку рабочего контекста
this.MySource_CommonWagonInformation.DomainContext = this.GlobalEntityContext;


было непонятно в чём тогда проблема... - Проблема была в том, что и первичную загрузку this.GlobalEntityContext.Load<....... программа уже не могла выполнить - поскольку небыл попросту готов объект страницы ))))))))))))

Попросту раньше чем отработает до конца инициализация страницы потомка, нельзя и пытаться лепить (пусть даже одинаковую) логику от WCF RIA в предка.


Пришлось всё равно оставить, и всё равно дублировать в потомках всё с этим связанное

public partial class StationPromishlennayaPage : CommonDetalizationPage //класс организации интерфейса страницы детализации станции Промышленная
{
public StationPromishlennayaPage() //на перегрузку конструктора экземпляров данного типа
{
this.InitializeComponent(); //на вызов логики инициализации компонент текущей страницы приложения

..........................
..............................................
......................................................................

//на загрузку процедуры получения данных о вагонах из БД через логику WCF RIA
this.GlobalEntityContext.Load<DataCommunicationSystem.GetNACommonWagonInformation_Result>(this.GlobalEntityContext.GetNACommonWagonInformation_ImportQuery(36, 0, 0, DateTime.Now.ToString()));
//на привязку рабочего контекста
this.MySource_CommonWagonInformation.DomainContext = this.GlobalEntityContext;
//на загрузку процедуры получения данных о вагонах на фронтах
this.MySource_CommonWagonInformation.LoadDelay = new TimeSpan(0);
this.MySource_CommonWagonInformation.AutoLoad = false;
this.MySource_CommonWagonInformation.QueryName = "GetNACommonWagonInformation_ImportQuery";


this.FirstParameter.Value = 36;
this.MySource_CommonWagonInformation.LoadedData += this.MySource_CommonWagonInformation_LoadedData;
this.MySource_CommonWagonInformation.Load();
}

А вот сами поля-объекты (типа DomainContext и DomainDataSource) удалось успешно перенести и инициализировать на уровне предка.

public abstract class CommonDetalizationPage : Page, IRailwayFrontsCollectionIncludable, IRailwayRoadsCollectionIncludable, IRailwayEntityDataIncludable //класс общей организации интерфейса необходимой страницы детализации требуемой станции
{
///////////////////////////////////////////////////////////////////////////
//ДИНАМИЧЕСКИЕ РАБОЧИЕ ПОЛЯ УРОВНЯ ВНЕШНЕГО КОНТЕНТА//
///////////////////////////////////////////////////////////////////////////
//контекст доступа к данным из базы по средствам инициализируемой модели данных
protected DataCommunicationDomainContext GlobalEntityContext = new DataCommunicationDomainContext();
protected DomainDataSource MySource_CommonWagonInformation = new DomainDataSource();
............................
..............................................


Как и залепить прямо туда все методы рабочей логики загрузки всех нужных данных ))

Обработчики событий для подсистемы навигации (физический движёк) - перенести в предка не удалось в силу отсутствия их описания в xaml части предка (у которого в моём случае нет собственной xaml части ))))) ). Однако и это можно обойти - описав все элементы управления вручную и залепить как их основное описание так и обработкчики тоже в предка ))))

Проблема решена!

Отдельное и большое спасибо LR!
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Проблема наследования страниц Page в Silverlight
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]