我建议制作一个“无外观”的控件,而不是制作用户控件。通常,我将用户控件用作我的无外观控件的胶水/容器。无外观控件的一个示例是 Button 类。它包含一个默认样式,在 Blend 中,您可以随意修改样式。它还支持可视状态管理器,因此您可以在状态更改时更改演示文稿的外观。您可以将无外观控件的代码隐藏视为迷你 ViewModel。在这里可以混合一些演示文稿和您的域类。
如果您遵循相同的设计,您可以创建一个 Ferry 无外观控件。这个控件会有一组它自己的依赖属性(可能监听 DP 的 OnChange)。
您的 Ferry 控件可能有一个名为“Trucks”的 ObservableCollection DP。
然后在您的 Themes\generic.xaml 中,为您的 Ferry 控件创建一个默认样式。您的默认样式可能具有 ItemsControl 和 ItemsSource={TemplateBinding Trucks}。ItemsControl 面板模板,可以是您自己的用于安排卡车的自定义面板,或者您可以使用 Canvas。对于 ItemsControl 项目模板,您将拥有如下内容:
<DataTemplate>
<mynamespace:TruckControl/>
</DataTemplate>
你的 Truck 控件,也将是一个具有自己默认样式的无外观控件,并且它的数据上下文已经设置,因此您可以直接执行 {Binding Path=xyz}。您的 Truck 控件还可以将其设置为 Canvas.Left/Top(如果您选择在 pervious items 控件中使用画布..或者如果您为其制作了自定义面板,它可能根本不设置其位置)或渲染变换为把它放在正确的 X,Y 上。您还可以使用卡车模板中的项目控件以与在渡轮控件中渲染卡车相同的方式渲染汽车。还可以为 VisualStateManager 创建状态以使其完全可支持 Blend。因此,例如,如果卡车进入“问题状态”,您可以轻松地将该状态设置为混合样式,使其闪烁红色。
我知道这听起来需要消化很多东西,但最终拥有所有支持 MVVM 模型的可样式化控件将使您的生活轻松 1000000 倍。
我建议研究 Microsoft 的 silverlight 工具包,以了解如何进行无外观控件等。尝试查看一个简单的控件,例如 DatePicker ( http://silverlight.codeplex.com/SourceControl/changeset/view/25992# ) 一个警告是忽略 DatePicker.xaml 文件(它只是通用内容的镜像。 xaml 并且如果您只是删除它就不会发生任何不好的事情)。
您应该密切注意的事项是:
1.) 类的属性。这些帮助 Blend 知道如何处理你的控制。
2.) OnApplyTemplate 覆盖。您可以在此处从模板中提取特定元素。这些被称为“部件”,您将在 Blend 中看到部件选项卡。#1 中的属性可以定义模板中的“部分”是什么以及它们应该是什么类型。
3.) 构造函数中的 DefaultStyleKey = typeof(...)。这告诉 Silverlight 在 generic.xaml 中使用什么默认模板
4.) 查看 Themes\generic.xaml。这是一个特殊的硬编码文件位置,用于存储所有默认模板。搜索 DatePicker 样式,您会明白的:)
祝你好运!