【发布时间】:2012-10-17 20:39:55
【问题描述】:
上面写着“Gets or sets...”,那为什么不让我改呢?
【问题讨论】:
-
看看这个来自 skeet 的详细答案。 stackoverflow.com/questions/1003772/…
上面写着“Gets or sets...”,那为什么不让我改呢?
【问题讨论】:
这里的重点是,分配给临时 struct 值内的属性是没有意义的,因为它没有持久的影响。
System.Windows.Thickness 是struct,label1.Margin 是Thickness 值的副本,用于label1 的边距。这是一个副本,因为structs 是按值传递的。分配给label1.Margin.Left 没有意义,因为您只会在label1.Margin 的副本中更改Left 的值。
您可以做以下事情:
Thickness t = label1.Margin;
t.Left = ......; // assign your value here
label1.Margin = t;
另请参阅MSDN page for the CS1612 error。
工具提示是“获取或设置...”,因为您可以获取或设置 label1 的 Margin 属性,但在您的特定情况下,分配给 label1.Margin 的 Left 属性是没有意义的.
【讨论】:
您不能这样做,因为尽管Margin.Left 获取或设置,但它并没有像变量一样使用。就像Padding。
您可能注意到,Margin(对于Padding)是一个属性,Thickness 是它的值。所以,当你说
label1.Margin.Left = MainGrid.ActualHeight / 2 - label1.ActualHeight / 2;
您只是在编辑一个副本(Margin),因为 Margin 返回一个结构 (Thickness)。这就是您收到错误消息的原因。更改未保存,因为它是副本!
基本上,虽然您可以将Object.Margin.Left 的值更改为特定值,但它不会保存/更改对象Margin 属性,这就是您收到错误的原因。
我们不能说
label1.Margin.Left = MainGrid.ActualHeight / 2 - label1.ActualHeight /2;
但我们可以说
Thickness NewThickness = new Thickness(); //Initialize a new Thicnkess
NewThickness.Left = MainGrid.ActualHeight / 2 - label1.ActualHeight /2; //Set the left property of NewThickness
label1.Margin = NewThickness; //Apply the changes to label1
这意味着,因为Margin是一个属性,所以你不能直接改变它的Thickness。
或者,您可以使用以下我认为更容易设置对象的Margin
label1.Margin = new Thickness(double left, double top, double right, double bottom);
谢谢,
希望对您有所帮助:)
【讨论】:
似乎所有参数对于 WPF Margin 属性都是必需的,尽管您可能希望一次只更改一个或两个属性值...
通过 Google 搜索,我在 Java 和 ASP.net 中看到使用边距属性设置了所有 4 个值。
但是,这个示例允许用户检索 Label.Margin.Left 值... http://forums.asp.net/t/1834713.aspx/1
【讨论】: