Wpf 如何编写伪纯写依赖属性?

Wpf 如何编写伪纯写依赖属性?,wpf,xaml,dependency-properties,writeonly,Wpf,Xaml,Dependency Properties,Writeonly,好的,这只是我脑海中关于一种“伪只写”依赖属性的想法。我之所以这样说,是因为我实际上甚至不希望存储值,而是希望传递给setter的值设置其他属性。作为一个假设的例子,我想这样做 <button UIHelper.Bounds="10,10,40,20" /> 而不是这个 <button Canvas.Left="10" Canvas.Top="10" Width="40" Height="20" /> 这只是一个XAML输入便利的东西,它让我可以设置实际的四个属性,并

好的,这只是我脑海中关于一种“伪只写”依赖属性的想法。我之所以这样说,是因为我实际上甚至不希望存储值,而是希望传递给setter的值设置其他属性。作为一个假设的例子,我想这样做

<button UIHelper.Bounds="10,10,40,20" />
而不是这个

<button Canvas.Left="10" Canvas.Top="10" Width="40" Height="20" />
这只是一个XAML输入便利的东西,它让我可以设置实际的四个属性,并且更容易输入,这要感谢一个只写的附加属性。沿着崩溃的CSS规则思考。事实上,为了这个效果,这里有另一个

<border UIHelper.BrushSpec="AliceBlue Red 2 4" />
而不是

<border Background="AliceBlue" BorderBrush="Red" BorderThickness="2" CornerRadius="4" />
现在以第一个为例,一个想法是在内部存储这样的结构,然后将其与现有的宽度、高度、Canvas.Left和Canvas.Top属性同步,但我真的不打算将其读回,因此不需要这样做。从技术上讲,我可以完全忽略它的存储,只在propertychanged处理程序中调用ClearValue,但同样,它并不真正用于读取它,所以这只是为了一致性

从技术上讲,我甚至不想/不需要这是一个DP,除非我的理解是,如果需要从XAML设置它,它必须是一个DP,因此我要的是。如果我们可以直接设置一个.NET属性,那就太好了,因为我可以设置实现,并根据需要重新构建它自己,但是我知道您不能从XAML访问.NET属性,因此我就在这里

现在我知道很多人都不赞成这个概念,尤其是XAML的纯粹主义者,但我问为什么不这样做,如果没有其他理由,认为这是一个“可以做”而不是“应该做”的练习。我甚至不是说我会用这个。我只是想更好地理解DPs和XAML的局限性,我发现这样的练习非常有用

那么,想法呢


M

不必编写自己的XAML编译器,我认为最好的方法是使用附加属性,根据您定义的一些紧凑语法设置您感兴趣的属性组。是的,这意味着您已经为紧凑表示分配了存储空间,但正如您所说,您可以在应用后立即清除它。这可能有点不正统,但从技术上讲是可行的

您也可以尝试根本不声明附加的属性字段,以便通过get/set方法访问值。我没有尝试过这一点,但我相信它在DP是私有的情况下可以工作,所以这可能会起作用。通过这种方式,您实际上也可以让它可读,而不必去监听相关属性的更改。当然,这意味着您的财产将不会有更改通知:

public static string GetBounds(UIElement uiElement)
{
    return Canvas.GetLeft(uiElement) + "," + ...;
}

public static void SetBounds(UIElement uiElement, string compact)
{
    // parse and apply compact
}

我只是将紧凑表示放在上面的字符串中,但您可能希望使用特定类型。同样,上述方法可能不起作用-您可能需要关联的DependencyProperty实例。如果我在Windows机器上,我会试试。

是的,我很确定你的后一个评论不会起作用,因为我上面提到的原因。。。无法从XAML访问非DP属性。实际上,他们特别警告不要在.NET属性getter或setter中放入任何代码,因为当通过XAML对应项进行访问时,它们会被完全绕过。至于你的第一部分,那正是我上面描述的。