好的,所以这只是一个关于某种'伪写 - 唯一'依赖属性的想法。我说有点因为我实际上甚至不希望存储该值,而是我想要传递给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" />
现在使用第一个作为示例,一个想法是在内部存储这样的结构,然后将其与现有的Width,Height,Canvas.Left和Canvas.Top属性同步,但我真的不打算阅读它退出,所以不需要。 (从技术上讲,我可以完全忽略它的存储,只需在propertychanged处理程序中调用ClearValue,但是再次,它不是真正用于读取它,所以这只是为了保持一致性。)
从技术上讲,我甚至不希望/需要它成为DP,除了我的理解是如果你需要从XAML设置它,它必须是DP,因此我所追求的。如果我们可以设置一个直接的.NET属性,因为我可以设置实现,并根据需要重建自己,这将是完美的,但同样,我知道你不能从XAML访问.NET属性,因此我'我回到这里。
现在是的,我知道很多人都不赞同这个概念,尤其是XAML纯粹主义者,但我要求 其他原因,认为这是“可以做”而不是“应该做”的练习。我甚至没有暗示这是我将要使用的。我只是想更好地理解DP和XAML的限制,我觉得这样的练习真的很有帮助。
所以,想法??
中号
答案 0 :(得分:0)
在没有编写自己的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
}
我只是将紧凑表示放在上面的string
中,但您可能想要使用特定类型。同样,上述内容可能无效 - 您可能需要关联的DependencyProperty
实例。如果我在Windows机器上,我会尝试。