|
Проблема наследования страниц Page в Silverlight
|
|||
---|---|---|---|
#18+
Ребят, всем здравствуйте! Для своего приложения на 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), ничего не получается. Подскажите пожалуйста, можно ли это реализовать вообще? Или всё таки нет? Спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2013, 11:10 |
|
Проблема наследования страниц Page в Silverlight
|
|||
---|---|---|---|
#18+
По моему Вы слишком увлеклись наследованием. В чем сокральный смысл наследования от Page? Используйте Page как контейнер в котором размещайте свои юзер-контролы. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2013, 15:50 |
|
Проблема наследования страниц Page в Silverlight
|
|||
---|---|---|---|
#18+
multiuser, если XAML-часть базовой страницы не нужна (т.е. можно обойтись без нее), то проблем с наследованием вообще никаких не должно быть, а вот если нужна, тогда есть несколько нюансов... ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2013, 03:50 |
|
Проблема наследования страниц Page в Silverlight
|
|||
---|---|---|---|
#18+
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 других ошибок нет ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2013, 10:05 |
|
Проблема наследования страниц Page в Silverlight
|
|||
---|---|---|---|
#18+
EDUARD SAPOTSKI, в данном случае мне это на самом деле необходимо. дело в том, что у меня проект интерактивной карты подъездных путей на станциях одного предприятия. но станций несколько (в данном случае 5). и каждая из них масштабируется, двигается, несёт в себе кучу семантической информации, с возможностью ткнув скажем на какую-то часть карты - получать определённую информацию из БД об этом объекте на карте. по сути - вся логика практически универсальна и одинакова для всех карт. инструменты навигации (кнопочки - приблизить/отдалить там и т.д.) - тоже одинаковые везде. а различно в принципе только графическое наполнение которое представляет собой картинки в качестве подложек. поэтому конечно писать постоянно для каждой станции всё в отдельной странице - дело совершенно неблагодарное (( ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2013, 10:21 |
|
Проблема наследования страниц Page в Silverlight
|
|||
---|---|---|---|
#18+
multiuser, Набросал для Вас примерчик (проект vs2010 прилагается), для обоих случаев - Base1 без xaml-части, Base2 с xaml. В последнем случае нюансы в том, что, во-первых, надо определиться куда размещать xaml-содержимое страницы-наследницы (в примере это ContentStuff как содержимое Border-а), во-вторых, возникает нюанс с использованием обработчиков событий базового класса (в примере см. Button_Click). Вполне вероятны и другие "особенности" такого наследования, с которыми я не сталкивался (в моих проектах базовые странички без xaml-части) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2013, 14:44 |
|
Проблема наследования страниц Page в Silverlight
|
|||
---|---|---|---|
#18+
LR, вчера удалось всё сделать самостоятетельно, по принципу - без XAML части. уже всё работало почти как надо. пришлось завиртуалить большинство методов, но однако большую часть удалось таки перенести в общего предка. хотел написать что всё - ничего не надо. но сегодня обновили нам компоненты DevExpress, пришлось делать очередной апгрейд библиотек, и опять всё рухнуло. щас опять в xaml коде пишет - немогу создать экземпляр типа CommonDetalizationPage. вот мучаюсь опять. вариант с визуальным наследованием именно от Page довёл вчера почти до рабочего состояния но та одна ошибка всё равно висит. щас буду смотреть ваши примеры. спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2013, 09:24 |
|
Проблема наследования страниц Page в Silverlight
|
|||
---|---|---|---|
#18+
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) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2013, 13:36 |
|
Проблема наследования страниц Page в Silverlight
|
|||
---|---|---|---|
#18+
multiuser, т.е., после обновления компонент DevExpress, проект компилируется нормально? "начало валиться при инициализации страницы потомка" - это в рантайме? а какая ошибка? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2013, 16:19 |
|
Проблема наследования страниц Page в Silverlight
|
|||
---|---|---|---|
#18+
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="Схема станции Промышленная"> ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2013, 07:08 |
|
Проблема наследования страниц Page в Silverlight
|
|||
---|---|---|---|
#18+
multiuserна этапе выполнения валится уже после отработки всех инициализаторов полей и конструктора базового типа - при возврате к конструктору потомка - на 1-м же вызове из него InitializeComponent();Используйте отладчик и посмотрите более детально что за ошибка - InnerException, StackTrace... ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2013, 12:47 |
|
Проблема наследования страниц Page в Silverlight
|
|||
---|---|---|---|
#18+
Уже сделал. Кратко - проблема в данных получаемых через 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! ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2013, 14:34 |
|
|
start [/forum/topic.php?fid=21&msg=38446465&tid=1441267]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
77ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
others: | 12ms |
total: | 181ms |
0 / 0 |