Я бы порекомендовал сделать элемент управления без внешнего вида, а не пользовательский. Обычно я использую пользовательские элементы управления в качестве клея / контейнера для своих элементов управления без внешнего вида. Примером элемента управления без внешнего вида является класс Button. Он содержит стиль по умолчанию, а в Blend вы можете изменять стиль по своему вкусу. Он также поддерживает визуальный менеджер состояний, так что вы можете изменить внешний вид презентации при изменении состояний. Вы можете думать о коде позади элемента управления без внешнего вида как о мини-модели представления. Здесь ок , чтобы смешать некоторые презентационные материалы и классы вашего домена.
Если вы будете следовать этому же дизайну, вы можете создать элемент управления Ferry lookless. Этот элемент управления будет иметь набор своих собственных свойств зависимостей (возможно, прослушивание OnChange DP).
Ваш элемент управления Ferry может иметь DP ObservableCollection, называемый "Грузовики".
Затем в вашем Themes \ generic.xaml создайте стиль по умолчанию для элемента управления Ferry. Ваш стиль по умолчанию может иметь ItemsControl с ItemsSource = {TemplateBinding Trucks}. Шаблон панели ItemsControl, может быть вашей собственной панелью для упорядочивания грузовиков или, может быть, вы используете Canvas. Для шаблона ItemsControl items у вас будет что-то вроде этого:
<DataTemplate>
<mynamespace:TruckControl/>
</DataTemplate>
Элемент управления You Truck также может быть элементом управления без внешнего вида со своим собственным стилем по умолчанию, и его контекст данных уже будет установлен, поэтому вы можете напрямую выполнить {Binding Path = xyz}. Элемент управления Truck также может установить его Canvas.Left / Top (если вы решили использовать холст в элементе управления проницаемыми элементами ... или, может быть, он вообще не устанавливает свою позицию, если для него сделана пользовательская панель) или рендер преобразовать так, чтобы поставить его в правильном X, Y. Вы также можете использовать элемент управления элементами в шаблоне грузовика для рендеринга автомобилей так же, как для грузовиков в элементе управления паромом. Также возможно создавать состояния для VisualStateManager, чтобы сделать его полностью поддерживаемым Blend. Поэтому, если грузовик переходит в «проблемное состояние», вы можете легко оформить это состояние, например, в blend, чтобы оно мигало красным.
Я знаю, что это много, но, в конце концов, наличие стилей управления, поддерживающих модель MVVM, сделает вашу жизнь в 1000000 раз проще.
Я бы посоветовал изучить набор инструментов Microsoft Silverlight, чтобы получить представление о том, как создавать бесцветные элементы управления и тому подобное. Попробуйте взглянуть на простой элемент управления, такой как DatePicker (http://silverlight.codeplex.com/SourceControl/changeset/view/25992#). Одно предостережение - игнорировать файл DatePicker.xaml (это просто зеркало того, что помещается в generic.xaml, и ничего плохого не произойдет, если вы просто удалите его) .
На что следует обратить пристальное внимание:
1.) Атрибуты в классе. Они помогают Blend знать, как справляться с вашим контролем.
2.) Переопределение OnApplyTemplate. Здесь вы можете извлечь определенные элементы из вашего шаблона. Они известны как «части», и вы увидите вкладку частей в Blend. Атрибуты в # 1 могут определять, какие «части» находятся в шаблоне и какого типа они должны быть.
3.) DefaultStyleKey = typeof (...) в конструкторе. Это сообщает Silverlight, какой шаблон по умолчанию использовать в generic.xaml
4.) Посмотрите на Темы \ generic.xaml. Это специальное жестко закодированное местоположение файла, в котором хранятся все ваши шаблоны по умолчанию. Ищите стиль DatePicker, и вы получите идею:)
Удачи!