Какой был бы хороший подход для нескольких приложений Silverlight с общими элементами управления?

#silverlight #xaml #inheritance #base-class

#silverlight #xaml #наследование #базовый класс

Вопрос:

Я довольно новичок в Silverlight, и мне нужно закодировать несколько приложений SL, которые будут делиться многими вещами.

Я планирую поместить весь общий код C # в отдельную сборку, но меня действительно раздражает часть XAML.

Все мои приложения будут иметь некоторые общие элементы управления:

  • строка меню вверху,
  • панель инструментов вверху,
  • строка состояния внизу,
  • панель слева.

Я искал в Интернете подсказки и обнаружил, что код XAML не может быть унаследован.

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

Какова наилучшая практика здесь?

Любая помощь приветствуется,

РЕДАКТИРОВАТЬ: то, что я хотел бы получить здесь, это то, что я уже сделал с WinForms. Я создал «базовую» WinForm и поместил в нее некоторые элементы управления. Затем, когда я создал новые WinForms, которые унаследовали эту «базовую» WinForm, у них были все основные элементы управления. Мне не нужно было использовать какой-либо пользовательский элемент управления.

Но я понимаю, что Silverlight — это не WinForm, и то, что я хочу, может быть невозможно таким образом (или вообще?).

Ответ №1:

Это зависит от маршрута, который вы хотите выбрать, хотите ли вы создать один файл ресурсов с некоторыми шаблонами и т. Д., Который копируется / связывается с каждым приложением отдельно, Или использовать что-то, включенное в общую DLL.

Если вы хотите сделать последнее, вот один из подходов. Подкласс ContentControl для определения вашего общего макета в своем шаблоне элемента управления (вы можете сделать все это в XAML), включая привязку к его содержимому в соответствующем месте:

 <ContentControl x:Class="MyLibrary.MyLayoutControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ContentControl.Template>
        <ControlTemplate TargetType="ContentControl">
            <!-- this could be a layout grid with various other controls in it -->
            <Border BorderBrush="Red" BorderThickness="2" CornerRadius="5">
                <ContentPresenter Content="{TemplateBinding Content}" />
            </Border>
        </ControlTemplate>
    </ContentControl.Template>
</ContentControl>
 

Затем используйте его в корневом элементе управления вашего приложения:

 <UserControl x:Class="InCustomControlTest.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:c="clr-namespace:MyLibrary;assembly=MyLibrary">

    <c:MyLayoutControl>
        <Button Content="Hi I am a button" />
    </c:MyLayoutControl>
</UserControl>
 

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

Комментарии:

1. Вы в значительной степени спасли мне жизнь. ; o) Действительно, я хотел что-то в общей DLL, и ваше решение, похоже, справилось с задачей. Большое спасибо!

Ответ №2:

Нет большой проблемы с размещением ресурсов xaml в библиотечных проектах. При ссылке на resourcedictionaries из других проектов обязательно указывайте имя сборки. Также существует наследование шаблонов, куда вы можете поместить BasedOn атрибут.

Редактировать: ну, глядя на проект, над которым мы работали некоторое время назад, я теперь помню, что у нас действительно были проблемы с ним, и ресурсы xaml копировались в каждый проект… Я забыл =) Я думаю, что это сработало, но вызвало некоторые проблемы здесь и там. Может быть, добавить файлы xaml в качестве ссылок?

Лично я бы также не создавал для многих элементов управления, а имел шаблоны для большинства материалов. Если у вас есть элементы управления, лучше пишите их на c # только с использованием шаблонов, предотвращая использование xaml с использованием кода. Просто мой личный опыт, возможно, не является общим руководством.

Комментарии:

1. Спасибо за ваш ответ, но я не уверен, что полностью его понимаю. Если я определяю элементы управления в шаблонах C # , мне все равно придется добавлять их на все свои страницы, верно? Я отредактирую свой вопрос, чтобы попытаться лучше объяснить, чего я хотел бы достичь.