|
Наследование для окон
|
|||
---|---|---|---|
#18+
Всем привет! У меня следующий вопрос: имеется главное окно, у которого прописан стиль "WindowStyle", который я вынес в отдельный файл WindowStyle.xaml, все методы, касающиеся передвигания окна, кнопок свернуть и закрыть вынес в класс WindowStyle.cs, вопрос в том, как мне унаследовать эти методы, для второго созданного окна, я сделал класс WindowStyle абстрактным: Код: c# 1.
и пытаюсь унаследоваться от него: Код: c# 1.
, но подчеркивает и выдает, что base class differs from declared in other parts, заранее спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2016, 13:09 |
|
Наследование для окон
|
|||
---|---|---|---|
#18+
other parts в данном случае - это xaml покажите его заголовок ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2016, 13:57 |
|
Наследование для окон
|
|||
---|---|---|---|
#18+
я тут прочитал, что вроде как базовый класс должен быть без xaml, иначе работать не будет, это так? вот WindowStyle.xaml это у меня словарь ресурсов Код: c# 1. 2. 3. 4. 5.
также в ошибках пишет: error CS0263: Разделяемые объявления "DClass" не должны указывать различные базовые классы. Сам xaml класса DClass: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2016, 14:04 |
|
Наследование для окон
|
|||
---|---|---|---|
#18+
Что-то вы с неймспейсами намудрили сильно в xaml А вообще, мне кажется, вы не тем путем идете. Изложите лучше задачу. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2016, 14:21 |
|
Наследование для окон
|
|||
---|---|---|---|
#18+
просто стили окон 3адаются декларативно, не совсем мне понятно, 3ачем для этого файл с кодом? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2016, 14:24 |
|
Наследование для окон
|
|||
---|---|---|---|
#18+
да, возможно иду не тем путем, в общем излагаю как все есть: у меня есть главное окно MainWindow.xaml, изначально я решил вынести всю общую стилизацию окна в словарь ресурсов в файле WindowStyle.xaml, в MainWindow.xaml я прописал Код: xml 1.
все работает, затем я создал дочернее окно DClass.xaml, которое также должно иметь тот же стиль, что и у главного, поэтому я так же прописал для него: Код: xml 1.
но столкнулся с проблемой, так как компоненты, которые я добавил на главное окно прописаны в том же файле в стиле WindowStyle, следовательно они будут наследоваться и в дочернее окно, я решил прописывать отдельно для каждого окна один и тот же стиль в файлах MainWindow и DClass.xaml: Код: xml 1.
правильно ли это? ведь тогда будет дублирование кода, а я бы хотел его избежать. вот то же самое и с методами перетаскивания окна, они находятся в классе WindowStyle.cs и оба окна их должны использовать, поэтому по идее нужно унаследовать эти методы в класс дочернего окна DClass вот в общем, не знаю понятно ли я описал ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2016, 14:41 |
|
Наследование для окон
|
|||
---|---|---|---|
#18+
укажите что не так делаю? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2016, 16:03 |
|
Наследование для окон
|
|||
---|---|---|---|
#18+
SWRукажите что не так делаю? ра3ные подxоды есть, основной шаблон для WРF это MVVM, в этом шаблоне содержимое окна и его стили определяются в XAML файлаx, модель представления в отдельныx классаx которые будут выступать в качестве контекста данныx. Для передачи команд в VM исполь3уют ICommand, а для получения представления Binding. Для и3менения поведения контрола исполь3уют AttachedРroрerty/Behavior<T> или наследование от Control'ов. окнами управляют по ра3ному, в большом проекте обычно это manager окон, а в маленьком можно просто открывать бе3 всякиx 3амарочек. 1 открытое окно автоматически становится MainWindow ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2016, 16:51 |
|
Наследование для окон
|
|||
---|---|---|---|
#18+
что конкректно на моем примере не так именно, про mvvm паттерн знаю, я и пытаюсь собственно стили делать в xaml, сам код программы в классах ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2016, 17:31 |
|
Наследование для окон
|
|||
---|---|---|---|
#18+
именно что я не так делаю с наследованием ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2016, 19:09 |
|
Наследование для окон
|
|||
---|---|---|---|
#18+
SWRда, возможно иду не тем путем, в общем излагаю как все есть: у меня есть главное окно MainWindow.xaml, изначально я решил вынести всю общую стилизацию окна в словарь ресурсов в файле WindowStyle.xaml, в MainWindow.xaml я прописал Код: xml 1.
все работает, затем я создал дочернее окно DClass.xaml, которое также должно иметь тот же стиль, что и у главного, поэтому я так же прописал для него: Код: xml 1.
но столкнулся с проблемой, так как компоненты, которые я добавил на главное окно прописаны в том же файле в стиле WindowStyle, следовательно они будут наследоваться и в дочернее окно, я решил прописывать отдельно для каждого окна один и тот же стиль в файлах MainWindow и DClass.xaml: Код: xml 1.
правильно ли это? ведь тогда будет дублирование кода, а я бы хотел его избежать. вот то же самое и с методами перетаскивания окна, они находятся в классе WindowStyle.cs и оба окна их должны использовать, поэтому по идее нужно унаследовать эти методы в класс дочернего окна DClass вот в общем, не знаю понятно ли я описал Что за методы перетаскивания окна? В любом случае, вам нужно создать модель представления для окна, в которой будет ваша логика по работе с окном в виде команд. Потом вы эту модель присваиваете контексту данных окна. Для главного окна создание этого главного окна, создание для него модели представления и присвое контекста данных может идти в классе App. А для дочернего - в команде, которая вызывает это дочернее окно. Вообще, посмотрите пример достаточно простого приложения, созданного по шаблону MVVM. Там же можно исходный код скачать. Там есть прямо то, что я сказал - создание главного окна в классе App. В том приложении не создаётся дочерних окон, зато создаются дочерние вкладки в одном и том же окне. Но суть от этого не меняется - вы создаёте модель представления, создаёте представление, привязываете контекст данных представления к модели представления и вызываете это представление на показ. А что из себя представляет представление (извиняюсь за тавтологию) - окно, вкладку или ещё что-то - неважно. Если вам нужно расшарить логику (команды, методы) между окнами, то в MVVM это значит, что вам нужно расшарить эту логику между моделями представления этих окон. Тогда, вы создаёте базовый класс для модели представления окна и помещаете туда эту логику, общую для нужных вам окон - всё как в наследовании с обычными классами. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2016, 01:09 |
|
Наследование для окон
|
|||
---|---|---|---|
#18+
Ну и плюс есть всякие заморочки с модальными окнами. Если фанатично следовать заветам MVVM, то там нельзя просто так из модели представления вызывать новые представления. Нужно написать сервис (просто класс), который это будет делать, и в модели представления вызывать методы этого сервиса, которые будут создавать новые представления (показывать модальное окно, например). А если не фанатично (маленькое приложение, например), то можно вызывать новые модальные окна прямо из модели представления главного окна. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2016, 01:15 |
|
Наследование для окон
|
|||
---|---|---|---|
#18+
По поводу сервисов для модальных окон - http://www.codeproject.com/Articles/70223/Using-a-Service-Locator-to-Work-with-MessageBoxes Вообще, чем дальше в лес, тем больше дров. Если упороться следованию заветам MVVM, то придётся столкнуться со всякими сервис-локаторами и прочей фигнёй, а это либо написание своих велосипедов, либо нужно разбираться и выбрать фреймворк, который предоставит вам всякие уже готовые сервис-локаторы. Ну и это не конец, конечно - правильное MVVM-преложение настолько обвязано всякими паттерн-фреймворками, что надо месяцок точно потратить, чтобы только со всем этим ознакомиться. Поэтому, если вам неохота во всём этом разбираться, просто вызывайте новое окно из команды модели представления дочернего окна. Это идёт против MVVM и разделения ответственностей (ведь теперь модель представления знает о представлении), но иногда можно на это наплевать. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2016, 01:20 |
|
Наследование для окон
|
|||
---|---|---|---|
#18+
Doomplay998По поводу сервисов для модальных окон - http://www.codeproject.com/Articles/70223/Using-a-Service-Locator-to-Work-with-MessageBoxes Вообще в приличном обществе за использование сервис-локатора бьют по рукам и отправляют копать траншеи, поскольку он является очень вредным антипаттерном. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2016, 06:16 |
|
Наследование для окон
|
|||
---|---|---|---|
#18+
Doomplay998Что за методы перетаскивания окна? Window.Move() ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2016, 09:56 |
|
Наследование для окон
|
|||
---|---|---|---|
#18+
Roman MejtesDoomplay998Что за методы перетаскивания окна? Window.Move() А зачем в дотнете их в коде делать? Не устраивает, как мышой таскается? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2016, 10:20 |
|
Наследование для окон
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныDoomplay998По поводу сервисов для модальных окон - http://www.codeproject.com/Articles/70223/Using-a-Service-Locator-to-Work-with-MessageBoxes Вообще в приличном обществе за использование сервис-локатора бьют по рукам и отправляют копать траншеи, поскольку он является очень вредным антипаттерном. А как тогда в MVVM модальные окна делать? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2016, 10:20 |
|
Наследование для окон
|
|||
---|---|---|---|
#18+
Doomplay998А как тогда в MVVM модальные окна делать? DI вовсе не состоит из одного сервис-локатора. Обычно используют DI-фреймворк, инжектируя нужные сервисы в composition root через constructor injection в первую очередь. Про анти-паттерность сервис-локатора, если что - это выдумал вовсе не я. Об этом пишет, например, Симанн . На русском развернуто можно прочитать здесь . ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2016, 11:29 |
|
Наследование для окон
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныDoomplay998А как тогда в MVVM модальные окна делать? DI вовсе не состоит из одного сервис-локатора. Обычно используют DI-фреймворк, инжектируя нужные сервисы в composition root через constructor injection в первую очередь. Про анти-паттерность сервис-локатора, если что - это выдумал вовсе не я. Об этом пишет, например, Симанн . На русском развернуто можно прочитать здесь .Всё, что там написано, говорит лишь о том, что Симанн не умеет применять ServiceLocator на практике. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2016, 11:36 |
|
Наследование для окон
|
|||
---|---|---|---|
#18+
"Проблема с Х в том, что одни его неправильно используют, а другие пишут статьи, почему Х - зло." https://habrahabr.ru/company/pvs-studio/blog/311998/ и ещё куча подобных статей, в которых вместо "Х" можно подставить вообще любую вещь в мире. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2016, 18:49 |
|
Наследование для окон
|
|||
---|---|---|---|
#18+
Кухонные ножи - зло. Ими можно не только порезаться, но и, что самое страшное, ими совершается подавляющее большинство бытовых убийств. Их нужно запретить и изъять у населения. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2016, 18:50 |
|
Наследование для окон
|
|||
---|---|---|---|
#18+
Doomplay998Кухонные ножи - зло. Ими можно не только порезаться, но и, что самое страшное, ими совершается подавляющее большинство бытовых убийств. Их нужно запретить и изъять у населения. Неккорректная аналогия. Вы приводите пример того, как что-то может быть использовано не по назначению, скрывая контекст того, что у чего-то вообще не может быть назначения. Ну а теперь по пунктам и аргументированно опровергните, что: 1) SL вносит неясность в контракт класса; 2) SL делает неопределенной сложность класса; 3) SL нарушает SOLID; 4) SL нарушает инкапсуляцию. Обоснования на все четыре тезиса есть выше по ссылкам. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2016, 19:04 |
|
Наследование для окон
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныDoomplay998Кухонные ножи - зло. Ими можно не только порезаться, но и, что самое страшное, ими совершается подавляющее большинство бытовых убийств. Их нужно запретить и изъять у населения. Неккорректная аналогия. Вы приводите пример того, как что-то может быть использовано не по назначению, скрывая контекст того, что у чего-то вообще не может быть назначения. Ну а теперь по пунктам и аргументированно опровергните, что: 1) SL вносит неясность в контракт класса; 2) SL делает неопределенной сложность класса; 3) SL нарушает SOLID; 4) SL нарушает инкапсуляцию. Обоснования на все четыре тезиса есть выше по ссылкам. Возможно, автору темы просто не нужно строгое соблюдение всех этих принципов. Тогда сервис-локатор подойдёт? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2016, 19:36 |
|
Наследование для окон
|
|||
---|---|---|---|
#18+
Я вообще, как я говорил, прямо из кода команды (из вью-модели) вызываю дочерние окна. Или вообще из code behind. Потому что мне просто не нужно делать как-то принципиальнее и более мудрёно. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2016, 19:37 |
|
Наследование для окон
|
|||
---|---|---|---|
#18+
Doomplay998Возможно, автору темы просто не нужно строгое соблюдение всех этих принципов. Тогда сервис-локатор подойдёт? Ну, есть и такой паттерн - вполне имеет себе право на жизнь. И в 90% случаев так себе и живет. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2016, 20:19 |
|
|
start [/forum/topic.php?fid=21&fpage=10&tid=1440608]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
71ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
61ms |
get tp. blocked users: |
2ms |
others: | 239ms |
total: | 417ms |
0 / 0 |