WPF设计师有一项艰巨的任务。为了向您展示您的屏幕或组件的生活视图,它必须执行代码,但是,由于您无法控制设计器,因此必须执行此操作而不会产生任何副作用。
那怎么做呢?有关执行的规则是什么?
MessageBox.Show
?GetIsInDesignMode
并创建并指定DataContext
如果为false,仍然设计师没有正确渲染。是否存在某种堆栈深度限制?有什么限制?
答案 0 :(得分:2)
它必须这样做而不产生任何副作用
不,设计师并不那么聪明。如果指定了IsDesignTimeCreatable
,它将在公共无参数构造函数和绑定访问的属性中执行所有代码。具体来说,它会弹出消息框,写入文件等 - 或者尝试抛出异常(只需自己试一试)。
如果您没有公共无参数构造函数,则无法创建实例,因此不会运行任何代码。
关于"堆栈深度限制"的问题,我知道没有这样的限制。如果你有一个特定的案例,它不起作用,我建议你问一个关于这个案子的具体问题。
在大多数情况下,设计人员失败是因为异常或其他与数据无关的问题(例如缺少设计时资源)。您应该使用DesignerProperties.GetIsInDesignMode
(我通常在基本视图模型中添加属性IsInDesignMode
)来保护您不希望在设计时调用的代码。
答案 1 :(得分:0)
这并不能完全回答你的问题,但说实话'它是如何运作的'并不是一个非常具体的问题。
然而,您是否知道可以在Xaml中添加这样的内容,而不是将此检查放入代码隐藏中?
d:DataContext="{Binding Source={d:DesignInstance Type=namespace:className, IsDesignTimeCreatable=True}}"
这意味着您可以制作课程的设计时版本,例如计算器设计:
ICalculator
,在Xaml中引用它,每次更改和编译设计时类时,视图将在VS内更新而不运行任何代码或在代码隐藏中具有复杂的逻辑。