none
Повторение кода в окнах WPF RRS feed

  • Вопрос

  • Добрый день, господа!

    Подскажите, как можно использовать один код в разных окнах WPF.

    Подробнее:

    Есть сетевая игра в шашки, решил добавить шахматы. Программа состоит из одного главного окна из которого открывается другое с игровым полем и все логикой шашек. Для добавления шахмат создал еще одно окно, куда перенес часть кода из первого. Например, в обоих окнах реализован чат, кнопки «сдаться», «ничья» и т.д. При этом в каждом окне есть и свои, уникальные контролы.  Возник вопрос как можно сделать что бы код не повторялся, очень не удобно вносить изменения, к тому же есть планы еще добавить игр. Попытка сделать одно окно как базовое, а остальные производные (т.е. наследование) не увенчалась успехом.

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

    Может есть способ?

Ответы

  • Добрый день.

    Ваша задача решается при помощи создания 1 окна для двух игр. На этом окне, у вас будут кнопки, чат и прочие штуки. А для игрового поля в окно помещаете ContentPresenter. Затем создаете два UserControl-а: один для шашек, второй для шахмат. Ну и показываете их в ContentPresenter-е формы.

    P.s. Да, к сожалению, если вы наследуете одну формы в другой, изменить часть отображения не получится. Либо заменять все, либо использовать то, что осталось от предка.

    • Предложено в качестве ответа LXGDARK 14 мая 2012 г. 14:08
    • Помечено в качестве ответа Игорь П 15 мая 2012 г. 4:50
    Отвечающий

Все ответы

  • Попытка сделать одно окно как базовое, а остальные производные (т.е. наследование) не увенчалась успехом.
    А почему? Может вы как то не так делали. Я бы создал базовое окно с единым функционалом и копилировал его в dll. Эту dll подключал бы к нужному проекту и создавал бы окна-экземпляры этого базового класса, а потом их доращивал до конкретного случая. Если нужно изменить базовое окно, меняем и перекомпонуем, все остальные проекты обращающиеся к этой dll тоже примут изменения.

    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

  • В принципе я так пробовал, но срабатывало только если базовое окно в одном проекте с призводным, если в отдельном dll компилируется нормально, но при выполнение выдает ошибку:

    В компоненте "Chess.MainWindowChess" отсутствует ресурс, соответствующий URI "/ClassWindow;component/windowclass1.xaml". 

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

    Может я что-то не так делал.

  • Сложно сказать что вы не так делали не зная что вы вообще делали :) Тут бы пошагово ваши действия знать бы...

    Кстати есть еще другой вариант. Window в WPF как и прочие элементы поддерживает шаблоны. Можно сделать словарь ресурсов в котором определить шаблон окна, а словарь подключать к нужным проектам. Рассмотрите еще этот вариант. Если он не подходит опишите подробнее проблему с dll


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

  • Архив примера

    LXGDARK если у вас найдется время глянуть пример.

    Поясню:

    Проект WpfMain - окно MainWindow - основное окно, в нем одна кнопка для создания и открытия окна MainWindowChess

    Проект Chess - окно MainWindowChess - производное окно от WindowBase или WindowBaseDll. В нем есть кнопка-пустышка.

    В этом же проекте базовое окно WindowBase, в нем одна кнопка "Close". Если наследую MainWindowChess от него, то кнопка "Close" есть, а кнопка-пустышка не выводится.

    Проект ClassWindow - базовое окно WindowBaseDll аналогично WindowBase, но в отдельном проекте, при наследовании от него при выполнении выдает ошибку.

    Возможно ли вообще наследование WPF окон. Может я зря пытаюсь.

    Спасибо.

  • Добрый день.

    Ваша задача решается при помощи создания 1 окна для двух игр. На этом окне, у вас будут кнопки, чат и прочие штуки. А для игрового поля в окно помещаете ContentPresenter. Затем создаете два UserControl-а: один для шашек, второй для шахмат. Ну и показываете их в ContentPresenter-е формы.

    P.s. Да, к сожалению, если вы наследуете одну формы в другой, изменить часть отображения не получится. Либо заменять все, либо использовать то, что осталось от предка.

    • Предложено в качестве ответа LXGDARK 14 мая 2012 г. 14:08
    • Помечено в качестве ответа Игорь П 15 мая 2012 г. 4:50
    Отвечающий
  • Алексей поиски привели к выводу что все таки как то можно создать окно с предзаданым видом и предзаданным поведением для наследования, но пока не могу понять как. Покоя не дает класс NavigationWindow. Судя по MSDN он наследник класса Window, но при этом имеет свою панель и особое поведение. Значит можно и самому такое сделать, и подключать к нужным проектам. По данному вопросу ваш ответ более чем подходит но по теме в целом... Мне вот очень интересно решить задачку, но у вас явно больше опыта. Давайте параллельно изучим вопрос на досуге и поделимся с народом.

    UPD. Создал обсуждение в соответствующей ветке, что бы подключить к решению задачи остальных участников.


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    • Изменено LXGDARK 14 мая 2012 г. 15:18
  • Исходники NavigationWindow доступны как часть reference source.

    Если его урезать до минимального примера, то получается получится что-то вроде: https://bitbucket.org/pashapash/templatedwindow

    Нужно на базовый класс окна повесить аттрибут [ContentProperty("Content")] и переопределить DefaultStyleKey для окна. И задать сам стиль в Generic.xaml.

    Модератор
  • Добрый день.

    Ваша задача решается при помощи создания 1 окна для двух игр. На этом окне, у вас будут кнопки, чат и прочие штуки. А для игрового поля в окно помещаете ContentPresenter. Затем создаете два UserControl-а: один для шашек, второй для шахмат. Ну и показываете их в ContentPresenter-е формы.

    P.s. Да, к сожалению, если вы наследуете одну формы в другой, изменить часть отображения не получится. Либо заменять все, либо использовать то, что осталось от предка.

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