Лучший отвечающий
Повторение кода в окнах WPF

Вопрос
-
Добрый день, господа!
Подскажите, как можно использовать один код в разных окнах WPF.
Подробнее:
Есть сетевая игра в шашки, решил добавить шахматы. Программа состоит из одного главного окна из которого открывается другое с игровым полем и все логикой шашек. Для добавления шахмат создал еще одно окно, куда перенес часть кода из первого. Например, в обоих окнах реализован чат, кнопки «сдаться», «ничья» и т.д. При этом в каждом окне есть и свои, уникальные контролы. Возник вопрос как можно сделать что бы код не повторялся, очень не удобно вносить изменения, к тому же есть планы еще добавить игр. Попытка сделать одно окно как базовое, а остальные производные (т.е. наследование) не увенчалась успехом.
Каждое окно представляет собой отдельный проект в рамках одного решения и компилируется в DLL.
Может есть способ?
14 мая 2012 г. 8:36
Ответы
-
Добрый день.
Ваша задача решается при помощи создания 1 окна для двух игр. На этом окне, у вас будут кнопки, чат и прочие штуки. А для игрового поля в окно помещаете ContentPresenter. Затем создаете два UserControl-а: один для шашек, второй для шахмат. Ну и показываете их в ContentPresenter-е формы.
P.s. Да, к сожалению, если вы наследуете одну формы в другой, изменить часть отображения не получится. Либо заменять все, либо использовать то, что осталось от предка.
14 мая 2012 г. 12:09Отвечающий
Все ответы
-
Попытка сделать одно окно как базовое, а остальные производные (т.е. наследование) не увенчалась успехом.
А почему? Может вы как то не так делали. Я бы создал базовое окно с единым функционалом и копилировал его в dll. Эту dll подключал бы к нужному проекту и создавал бы окна-экземпляры этого базового класса, а потом их доращивал до конкретного случая. Если нужно изменить базовое окно, меняем и перекомпонуем, все остальные проекты обращающиеся к этой dll тоже примут изменения.Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!
14 мая 2012 г. 8:43 -
В принципе я так пробовал, но срабатывало только если базовое окно в одном проекте с призводным, если в отдельном dll компилируется нормально, но при выполнение выдает ошибку:
В компоненте "Chess.MainWindowChess" отсутствует ресурс, соответствующий URI "/ClassWindow;component/windowclass1.xaml".
и самое главное окно-экземпляр не получается доростить в визуальном редакторе. При выводе окна-экземпляра выводятся только контролы из базового окна. Те что я дорисовал в производном окне пропадают. Если конечно программным способом добавить нужные, то да можно, но это не удобно.
Может я что-то не так делал.
14 мая 2012 г. 8:59 -
Сложно сказать что вы не так делали не зная что вы вообще делали :) Тут бы пошагово ваши действия знать бы...
Кстати есть еще другой вариант. Window в WPF как и прочие элементы поддерживает шаблоны. Можно сделать словарь ресурсов в котором определить шаблон окна, а словарь подключать к нужным проектам. Рассмотрите еще этот вариант. Если он не подходит опишите подробнее проблему с dll
Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!
14 мая 2012 г. 9:25 -
LXGDARK если у вас найдется время глянуть пример.
Поясню:
Проект WpfMain - окно MainWindow - основное окно, в нем одна кнопка для создания и открытия окна MainWindowChess
Проект Chess - окно MainWindowChess - производное окно от WindowBase или WindowBaseDll. В нем есть кнопка-пустышка.
В этом же проекте базовое окно WindowBase, в нем одна кнопка "Close". Если наследую MainWindowChess от него, то кнопка "Close" есть, а кнопка-пустышка не выводится.
Проект ClassWindow - базовое окно WindowBaseDll аналогично WindowBase, но в отдельном проекте, при наследовании от него при выполнении выдает ошибку.
Возможно ли вообще наследование WPF окон. Может я зря пытаюсь.
Спасибо.
14 мая 2012 г. 10:29 -
Добрый день.
Ваша задача решается при помощи создания 1 окна для двух игр. На этом окне, у вас будут кнопки, чат и прочие штуки. А для игрового поля в окно помещаете ContentPresenter. Затем создаете два UserControl-а: один для шашек, второй для шахмат. Ну и показываете их в ContentPresenter-е формы.
P.s. Да, к сожалению, если вы наследуете одну формы в другой, изменить часть отображения не получится. Либо заменять все, либо использовать то, что осталось от предка.
14 мая 2012 г. 12:09Отвечающий -
Алексей поиски привели к выводу что все таки как то можно создать окно с предзаданым видом и предзаданным поведением для наследования, но пока не могу понять как. Покоя не дает класс NavigationWindow. Судя по MSDN он наследник класса Window, но при этом имеет свою панель и особое поведение. Значит можно и самому такое сделать, и подключать к нужным проектам. По данному вопросу ваш ответ более чем подходит но по теме в целом... Мне вот очень интересно решить задачку, но у вас явно больше опыта. Давайте параллельно изучим вопрос на досуге и поделимся с народом.
UPD. Создал обсуждение в соответствующей ветке, что бы подключить к решению задачи остальных участников.
Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!
- Изменено LXGDARK 14 мая 2012 г. 15:18
14 мая 2012 г. 15:01 -
Исходники NavigationWindow доступны как часть reference source.
Если его урезать до минимального примера, то получается получится что-то вроде: https://bitbucket.org/pashapash/templatedwindow
Нужно на базовый класс окна повесить аттрибут [ContentProperty("Content")] и переопределить DefaultStyleKey для окна. И задать сам стиль в Generic.xaml.
14 мая 2012 г. 17:44Модератор -
Добрый день.
Ваша задача решается при помощи создания 1 окна для двух игр. На этом окне, у вас будут кнопки, чат и прочие штуки. А для игрового поля в окно помещаете ContentPresenter. Затем создаете два UserControl-а: один для шашек, второй для шахмат. Ну и показываете их в ContentPresenter-е формы.
P.s. Да, к сожалению, если вы наследуете одну формы в другой, изменить часть отображения не получится. Либо заменять все, либо использовать то, что осталось от предка.
15 мая 2012 г. 4:56