powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Наследование для окон
25 сообщений из 30, страница 1 из 2
Наследование для окон
    #39319217
SWR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SWR
Гость
Всем привет! У меня следующий вопрос: имеется главное окно, у которого прописан стиль "WindowStyle", который я вынес в отдельный файл WindowStyle.xaml, все методы, касающиеся передвигания окна, кнопок свернуть и закрыть вынес в класс WindowStyle.cs, вопрос в том, как мне унаследовать эти методы, для второго созданного окна, я сделал класс WindowStyle абстрактным:

Код: c#
1.
public abstract partial class WindowStyle {}



и пытаюсь унаследоваться от него:

Код: c#
1.
public partial class DClass: WindowStyle {}

, но подчеркивает и выдает, что base class differs from declared in other parts, заранее спасибо.
...
Рейтинг: 0 / 0
Наследование для окон
    #39319223
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
other parts в данном случае - это xaml

покажите его заголовок
...
Рейтинг: 0 / 0
Наследование для окон
    #39319225
SWR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SWR
Гость
я тут прочитал, что вроде как базовый класс должен быть без xaml, иначе работать не будет, это так?

вот WindowStyle.xaml это у меня словарь ресурсов

Код: c#
1.
2.
3.
4.
5.
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:local="clr-namespace:S"
                    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"
                    x:Class="S.WindowStyle"> ... </ResourceDictionary>



также в ошибках пишет:

error CS0263: Разделяемые объявления "DClass" не должны указывать различные базовые классы. Сам xaml класса DClass:

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<Window x:Class="S.DClass"
        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:local="clr-namespace:S"
        mc:Ignorable="d"
        Title="DClass" Height="300" Width="300"
        WindowStyle="None"
        ResizeMode="NoResize"
        >
...
Рейтинг: 0 / 0
Наследование для окон
    #39319232
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то вы с неймспейсами намудрили сильно в xaml

А вообще, мне кажется, вы не тем путем идете. Изложите лучше задачу.
...
Рейтинг: 0 / 0
Наследование для окон
    #39319233
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
просто стили окон 3адаются декларативно, не совсем мне понятно, 3ачем для этого файл с кодом?
...
Рейтинг: 0 / 0
Наследование для окон
    #39319237
SWR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SWR
Гость
да, возможно иду не тем путем, в общем излагаю как все есть:

у меня есть главное окно MainWindow.xaml, изначально я решил вынести всю общую стилизацию окна в словарь ресурсов в файле WindowStyle.xaml, в MainWindow.xaml я прописал
Код: xml
1.
Style="{StaticResource WindowStyle}"



все работает, затем я создал дочернее окно DClass.xaml, которое также должно иметь тот же стиль, что и у главного, поэтому я так же прописал для него:

Код: xml
1.
Style="{StaticResource WindowStyle}"



но столкнулся с проблемой, так как компоненты, которые я добавил на главное окно прописаны в том же файле в стиле WindowStyle, следовательно они будут наследоваться и в дочернее окно, я решил прописывать отдельно для каждого окна один и тот же стиль в файлах MainWindow и DClass.xaml:

Код: xml
1.
<Grid>тут по сути будет присутствовать один и тот же кусок кода только добавлены другие компоненты</Grid



правильно ли это? ведь тогда будет дублирование кода, а я бы хотел его избежать.

вот то же самое и с методами перетаскивания окна, они находятся в классе WindowStyle.cs и оба окна их должны использовать, поэтому по идее нужно унаследовать эти методы в класс дочернего окна DClass

вот в общем, не знаю понятно ли я описал
...
Рейтинг: 0 / 0
Наследование для окон
    #39319243
SWR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SWR
Гость
укажите что не так делаю?
...
Рейтинг: 0 / 0
Наследование для окон
    #39319250
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
Наследование для окон
    #39319255
SWR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SWR
Гость
что конкректно на моем примере не так именно, про mvvm паттерн знаю, я и пытаюсь собственно стили делать в xaml, сам код программы в классах
...
Рейтинг: 0 / 0
Наследование для окон
    #39319267
SWR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SWR
Гость
именно что я не так делаю с наследованием
...
Рейтинг: 0 / 0
Наследование для окон
    #39322350
Doomplay998
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SWRда, возможно иду не тем путем, в общем излагаю как все есть:

у меня есть главное окно MainWindow.xaml, изначально я решил вынести всю общую стилизацию окна в словарь ресурсов в файле WindowStyle.xaml, в MainWindow.xaml я прописал
Код: xml
1.
Style="{StaticResource WindowStyle}"



все работает, затем я создал дочернее окно DClass.xaml, которое также должно иметь тот же стиль, что и у главного, поэтому я так же прописал для него:

Код: xml
1.
Style="{StaticResource WindowStyle}"



но столкнулся с проблемой, так как компоненты, которые я добавил на главное окно прописаны в том же файле в стиле WindowStyle, следовательно они будут наследоваться и в дочернее окно, я решил прописывать отдельно для каждого окна один и тот же стиль в файлах MainWindow и DClass.xaml:

Код: xml
1.
<Grid>тут по сути будет присутствовать один и тот же кусок кода только добавлены другие компоненты</Grid



правильно ли это? ведь тогда будет дублирование кода, а я бы хотел его избежать.

вот то же самое и с методами перетаскивания окна, они находятся в классе WindowStyle.cs и оба окна их должны использовать, поэтому по идее нужно унаследовать эти методы в класс дочернего окна DClass

вот в общем, не знаю понятно ли я описал
Что за методы перетаскивания окна?

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

Для главного окна создание этого главного окна, создание для него модели представления и присвое контекста данных может идти в классе App. А для дочернего - в команде, которая вызывает это дочернее окно.

Вообще, посмотрите пример достаточно простого приложения, созданного по шаблону MVVM. Там же можно исходный код скачать. Там есть прямо то, что я сказал - создание главного окна в классе App. В том приложении не создаётся дочерних окон, зато создаются дочерние вкладки в одном и том же окне. Но суть от этого не меняется - вы создаёте модель представления, создаёте представление, привязываете контекст данных представления к модели представления и вызываете это представление на показ. А что из себя представляет представление (извиняюсь за тавтологию) - окно, вкладку или ещё что-то - неважно.

Если вам нужно расшарить логику (команды, методы) между окнами, то в MVVM это значит, что вам нужно расшарить эту логику между моделями представления этих окон. Тогда, вы создаёте базовый класс для модели представления окна и помещаете туда эту логику, общую для нужных вам окон - всё как в наследовании с обычными классами.
...
Рейтинг: 0 / 0
Наследование для окон
    #39322352
Doomplay998
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и плюс есть всякие заморочки с модальными окнами. Если фанатично следовать заветам MVVM, то там нельзя просто так из модели представления вызывать новые представления. Нужно написать сервис (просто класс), который это будет делать, и в модели представления вызывать методы этого сервиса, которые будут создавать новые представления (показывать модальное окно, например).

А если не фанатично (маленькое приложение, например), то можно вызывать новые модальные окна прямо из модели представления главного окна.
...
Рейтинг: 0 / 0
Наследование для окон
    #39322353
Doomplay998
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу сервисов для модальных окон - http://www.codeproject.com/Articles/70223/Using-a-Service-Locator-to-Work-with-MessageBoxes
Вообще, чем дальше в лес, тем больше дров. Если упороться следованию заветам MVVM, то придётся столкнуться со всякими сервис-локаторами и прочей фигнёй, а это либо написание своих велосипедов, либо нужно разбираться и выбрать фреймворк, который предоставит вам всякие уже готовые сервис-локаторы. Ну и это не конец, конечно - правильное MVVM-преложение настолько обвязано всякими паттерн-фреймворками, что надо месяцок точно потратить, чтобы только со всем этим ознакомиться. Поэтому, если вам неохота во всём этом разбираться, просто вызывайте новое окно из команды модели представления дочернего окна. Это идёт против MVVM и разделения ответственностей (ведь теперь модель представления знает о представлении), но иногда можно на это наплевать.
...
Рейтинг: 0 / 0
Наследование для окон
    #39322378
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Doomplay998По поводу сервисов для модальных окон - http://www.codeproject.com/Articles/70223/Using-a-Service-Locator-to-Work-with-MessageBoxes
Вообще в приличном обществе за использование сервис-локатора бьют по рукам и отправляют копать траншеи, поскольку он является очень вредным антипаттерном.
...
Рейтинг: 0 / 0
Наследование для окон
    #39322487
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Doomplay998Что за методы перетаскивания окна?
Window.Move()
...
Рейтинг: 0 / 0
Наследование для окон
    #39322505
Doomplay998
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman MejtesDoomplay998Что за методы перетаскивания окна?
Window.Move()
А зачем в дотнете их в коде делать? Не устраивает, как мышой таскается?
...
Рейтинг: 0 / 0
Наследование для окон
    #39322506
Doomplay998
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныDoomplay998По поводу сервисов для модальных окон - http://www.codeproject.com/Articles/70223/Using-a-Service-Locator-to-Work-with-MessageBoxes
Вообще в приличном обществе за использование сервис-локатора бьют по рукам и отправляют копать траншеи, поскольку он является очень вредным антипаттерном.
А как тогда в MVVM модальные окна делать?
...
Рейтинг: 0 / 0
Наследование для окон
    #39322577
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Doomplay998А как тогда в MVVM модальные окна делать?
DI вовсе не состоит из одного сервис-локатора. Обычно используют DI-фреймворк, инжектируя нужные сервисы в composition root через constructor injection в первую очередь.
Про анти-паттерность сервис-локатора, если что - это выдумал вовсе не я. Об этом пишет, например, Симанн . На русском развернуто можно прочитать здесь .
...
Рейтинг: 0 / 0
Наследование для окон
    #39322590
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныDoomplay998А как тогда в MVVM модальные окна делать?
DI вовсе не состоит из одного сервис-локатора. Обычно используют DI-фреймворк, инжектируя нужные сервисы в composition root через constructor injection в первую очередь.
Про анти-паттерность сервис-локатора, если что - это выдумал вовсе не я. Об этом пишет, например, Симанн . На русском развернуто можно прочитать здесь .Всё, что там написано, говорит лишь о том, что Симанн не умеет применять ServiceLocator на практике.
...
Рейтинг: 0 / 0
Наследование для окон
    #39323011
Doomplay998
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Проблема с Х в том, что одни его неправильно используют, а другие пишут статьи, почему Х - зло."

https://habrahabr.ru/company/pvs-studio/blog/311998/
и ещё куча подобных статей, в которых вместо "Х" можно подставить вообще любую вещь в мире.
...
Рейтинг: 0 / 0
Наследование для окон
    #39323013
Doomplay998
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кухонные ножи - зло. Ими можно не только порезаться, но и, что самое страшное, ими совершается подавляющее большинство бытовых убийств. Их нужно запретить и изъять у населения.
...
Рейтинг: 0 / 0
Наследование для окон
    #39323020
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Doomplay998Кухонные ножи - зло. Ими можно не только порезаться, но и, что самое страшное, ими совершается подавляющее большинство бытовых убийств. Их нужно запретить и изъять у населения.
Неккорректная аналогия. Вы приводите пример того, как что-то может быть использовано не по назначению, скрывая контекст того, что у чего-то вообще не может быть назначения.
Ну а теперь по пунктам и аргументированно опровергните, что:
1) SL вносит неясность в контракт класса;
2) SL делает неопределенной сложность класса;
3) SL нарушает SOLID;
4) SL нарушает инкапсуляцию.
Обоснования на все четыре тезиса есть выше по ссылкам.
...
Рейтинг: 0 / 0
Наследование для окон
    #39323031
Doomplay998
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныDoomplay998Кухонные ножи - зло. Ими можно не только порезаться, но и, что самое страшное, ими совершается подавляющее большинство бытовых убийств. Их нужно запретить и изъять у населения.
Неккорректная аналогия. Вы приводите пример того, как что-то может быть использовано не по назначению, скрывая контекст того, что у чего-то вообще не может быть назначения.
Ну а теперь по пунктам и аргументированно опровергните, что:
1) SL вносит неясность в контракт класса;
2) SL делает неопределенной сложность класса;
3) SL нарушает SOLID;
4) SL нарушает инкапсуляцию.
Обоснования на все четыре тезиса есть выше по ссылкам.
Возможно, автору темы просто не нужно строгое соблюдение всех этих принципов. Тогда сервис-локатор подойдёт?
...
Рейтинг: 0 / 0
Наследование для окон
    #39323032
Doomplay998
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я вообще, как я говорил, прямо из кода команды (из вью-модели) вызываю дочерние окна. Или вообще из code behind. Потому что мне просто не нужно делать как-то принципиальнее и более мудрёно.
...
Рейтинг: 0 / 0
Наследование для окон
    #39323047
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Doomplay998Возможно, автору темы просто не нужно строгое соблюдение всех этих принципов. Тогда сервис-локатор подойдёт?
Ну, есть и такой паттерн -

вполне имеет себе право на жизнь. И в 90% случаев так себе и живет.
...
Рейтинг: 0 / 0
25 сообщений из 30, страница 1 из 2
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Наследование для окон
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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