ControlTemplate的设计时数据

Mar*_*cki 6 wpf styles design-time controltemplate expression-blend

提供了设计时数据的DataContext是容易使用的d:DataContext,但是怎么样用引用控件属性{TemplateBinding}{RelativeSource TemplatedParent}Style.Template

当我DesignerProperties.GetIsInDesignMode(this)返回true 时,我是否应该在构造函数/ Loaded事件中使用示例数据填充控件? (不能这样做,因为它会打破正常的设计经验).

那些我无法修改的第三方控件呢?

Mik*_*ost 5

对于我自己的控件,我通常会执行以下操作:

<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 并不是真正的设计时间数据,但它有效。