在localValue2 = DependencyProperty.UnsetValue
object o1 = new Run("Test") { FontSize = 12 };
var r1 = o1 as TextElement;
if (r1 != null)
{
// 12.0
var localValue1 = r1.ReadLocalValue(TextElement.FontSizeProperty);
// 12.0
var getValue1 = r1.GetValue(TextElement.FontSizeProperty);
}
object o2 = new Run("Test");
var r2 = o2 as TextElement;
if (r2 != null)
{
// UnsetValue
var localValue2 = r2.ReadLocalValue(TextElement.FontSizeProperty);
// 12.0
var getValue2 = r2.GetValue(TextElement.FontSizeProperty);
}
然而,當TextElement
是樹的一部分,下面的結果,它可能會繼承其父級的非默認值。然後仍然沒有本地價值,但它也不是默認值。
object o3 = new Run("Test");
var textParent = new TextBlock(o3 as Run) { FontSize = 13 };
var r3 = o3 as TextElement;
if (r3 != null)
{
// UnsetValue
var localValue3 = r3.ReadLocalValue(TextElement.FontSizeProperty);
// 13.0
var getValue3 = r3.GetValue(TextElement.FontSizeProperty);
}
如果你想知道的默認值,使用var runElementFontsizeDefault = TextElement.FontSizeProperty.GetMetadata(r1).DefaultValue;
用Run r1
。
打開辯論:一個父元素可能有不同的默認值,所以如果本地值未設置,並且默認值不同於當前值,您仍然不知道父值是默認還是修改(除非你檢查)。
是的,這就是我想要的。有時調用者傳遞參數「運行」是使用默認的fontsize(可能是12,無論)創建的,所以它將使用與其父文本塊相同的字體大小。因爲調用者知道父母的大小,他只是懶惰地再次分配。有時,他會通過一定的字體大小,而且他肯定希望以這種大小顯示。如果尺寸與默認尺寸沒有差別,我無法猜測來電者的目的。 – Lucavin
哦,你可能會覺得奇怪,爲什麼不直接將它添加到TextBlock中。 Run對象是線程關聯的,不能被其他線程訪問。但TextBlock是由UI線程創建的。參數Run可以由不同的線程創建。爲了將它們放在一起,我爲UI線程創建了一個「運行」的新對象並複製它的屬性。所以默認值或不重要很重要。 – Lucavin