Mar*_*cki 6 wpf styles design-time controltemplate expression-blend
提供了设计时数据的DataContext是容易使用的d:DataContext,但是怎么样用引用控件属性{TemplateBinding}或{RelativeSource TemplatedParent}从Style.Template?
当我
(不能这样做,因为它会打破正常的设计经验).DesignerProperties.GetIsInDesignMode(this)返回true 时,我是否应该在构造函数/ Loaded事件中使用示例数据填充控件?
那些我无法修改的第三方控件呢?
对于我自己的控件,我通常会执行以下操作:
<Style x:Key="FooStyle>
<Setter Property="Template>
<Setter.Value>
<ControlTemplate TargetType="FooControl">
<Grid d:DataContext="{d:DesignInstance FooDesignTimeData, IsDesignTimeCreatable=True}">
... guts of control template go here ...
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Run Code Online (Sandbox Code Playgroud)
其中“FooDesignTimeData”是一个以适当形式提供设计时数据的类(在这里从运行时视图模型实现接口是一个很好的做法)。
我不明白为什么这对 3rd 方控制也不起作用。您甚至可能不必重新模板化控件——您可能可以通过在样式中指定第 3 方控件并为其提供上述指定的设计时数据上下文来摆脱困境,但我还没有尝试过这种情况。我假设您会遇到所有这些麻烦,因为您被迫使用没有很好的设计时体验的控件(例如通过提供 Vendor.Controls.Design.dll 或 Vendor.Controls.Expression.Design。 dll 文件)。
要使用 TemplateBindings,我没有很好的解决方案。通常我会创建一个测试页面来显示我的控件并允许我切换模板。在集成期间,您将拥有一个额外的视图(在您的应用程序中或作为单独的应用程序),允许您根据需要创建和操作控件的实例。来自 Blend SDK 的 GoToStateAction 目标触发操作在这里通常很有用。例如,为每个视觉状态创建一个按钮,然后使用 Click 偶数触发到特定状态的转换。因此,您可以在绑定到测试数据的同时轻松测试所有状态和转换。hacky 并不是真正的设计时间数据,但它有效。