#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 # , мне все равно придется добавлять их на все свои страницы, верно? Я отредактирую свой вопрос, чтобы попытаться лучше объяснить, чего я хотел бы достичь.