在WPF中,对于DP,是否有任何方法可以使用函数返回默认值或在getter端使用强制值?

在WPF中,对于DP,是否有任何方法可以使用函数返回默认值或在getter端使用强制值?,wpf,function,dependency-properties,default-value,Wpf,Function,Dependency Properties,Default Value,在WPF中有一个例外情况,我需要通过XAML设置一个依赖性属性,该属性实际上并不存储本身,而是用于设置其他依赖性属性。这非常简单,因为我只需使用强制值截取更改,对传入的值执行我想要的操作,然后取消对该属性的更改。这意味着当我得到该属性时,我仍然会得到默认值,因为我阻止了实际的更改。效果很好 例如,当我设置这个人造CanvasRect=“10,10,40,20”DP时,它实际上在内部设置Canvas.Left、Canvas.Top、Width和Height DPs,而CanvasRect本身仍然保

在WPF中有一个例外情况,我需要通过XAML设置一个依赖性属性,该属性实际上并不存储本身,而是用于设置其他依赖性属性。这非常简单,因为我只需使用强制值截取更改,对传入的值执行我想要的操作,然后取消对该属性的更改。这意味着当我得到该属性时,我仍然会得到默认值,因为我阻止了实际的更改。效果很好

例如,当我设置这个人造CanvasRect=“10,10,40,20”DP时,它实际上在内部设置Canvas.Left、Canvas.Top、Width和Height DPs,而CanvasRect本身仍然保持默认值“0,0,0,0”

然而,我有一个想法,如果我要改为读取属性,我希望基于那些其他依赖属性重新水合该值。这可以通过一个简单的单行函数来完成

return new rect(Canvas.GetLeft(this), Canvas.GetTop(this), Width, Height);
可以将其视为一种强制值,但在getter端,而不是setter端。但是,我不知道如何,甚至不知道是否可以使用函数强制这样的读回值

注意:是的,我知道此方法将使任何更改通知无效 为了拉票,但我没有 关心,我也不想那样。如果 是的,我会储存一个真实的 rect,然后通过 已更改对属性的订阅 画布上的事件。左侧,画布。顶部, 宽度和高度DPs,其中 从功能上来说,我会给我我想要的 想要,但这更像是一个 比实际的DP更方便。 另外,这是一个非常简单的例子来说明我的问题。 现实世界的例子可能是 基于时间的,例如,在没有DP的情况下 更改通知无论如何都很重要。

现在我知道我也可以简单地在getter中实现我想要的.NET包装器属性,但是当通过绑定之类的方式读取时,.NET属性包装器被绕过,这就是为什么MSDN说除了DP之外,永远不要将其用于任何事情。另外,现实地说,对于除一次性之外的任何事情,这都没有意义,因为同样,不会发生更改通知

无论如何,正如我所说的,DP setter工作得很好,但是如果我真的想加入getter,我不确定我能想出任何其他的方法,除了为相关的DPs连接所有这些更改通知

另一个可能需要这样做的例子是,您希望在属性getter本身中使用返回值的值转换器,可能是为了将返回值保持在某个范围内,但不会丢失实际存储的值以用于其他内部目的


但回到这里的基本问题:是否有任何方法可以使用函数作为DP的默认值,或者至少在getter端使用强制值?

值强制仅适用于更改DP的有效值。它不适用于读取DP值。您可能会创建另一个分配了CanvasRect值的DP,例如CachedCanvasRect,并在CanvasRect更改值时更新缓存的DP。

如果要这样做,为什么还要对缓存的值使用第二个DP?我只是将缓存的rect存储在CanvasRect DP本身中。同样,其他事情(其他DPs、时间等)都可以更改缓存的值,因此它不只是在CanvasRect的setter上。简而言之,我不认为你可以用这种方式使用DPs。不管怎么说,看起来都不像。哦,突然-@Josh Smith正在回答WPF的问题@我一定是误解了你的确切要求。不管怎样,值强制用于设置,而不是获取。@thedugs。。。为什么对乔希·史密斯如此感兴趣。我错过什么了吗?我们都是吗?!!这一带的人都很有名?!!