1

好的,所以这只是我脑海中浮现的关于一种“仅伪写”依赖属性的想法。我之所以这么说,是因为我实际上什至不希望存储该值,而是希望将传递给 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 的限制,我发现这样的练习真的很有帮助。

所以,想法??

4

1 回答 1

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 机器上,我会尝试一下。

于 2011-03-22T23:46:24.733 回答