MyControl.Margin.Left = 10;
Run Code Online (Sandbox Code Playgroud)
错误:
无法修改'System.Windows.FrameworkElement.Margin'的返回值,因为它不是变量
Jon*_*eet 124
问题是它Margin
是一个属性,它的type(Thickness
)是一个值类型.这意味着当您访问该属性时,您将获得该值的副本.
即使您可以更改Thickness.Left
特定值的属性值(grr ...不应存在可变值类型),也不会更改边距.
相反,您需要将Margin
属性设置为新值.例如(巧合的是与Marc写的相同的代码):
Thickness margin = MyControl.Margin;
margin.Left = 10;
MyControl.Margin = margin;
Run Code Online (Sandbox Code Playgroud)
作为图书馆设计的一个注释,如果Thickness
是不可变的,我会非常喜欢它,但是使用返回新值的方法,这是一个原始版本的副本,但是有一个部分被替换.然后你可以写:
MyControl.Margin = MyControl.Margin.WithLeft(10);
Run Code Online (Sandbox Code Playgroud)
不用担心可变值类型的奇怪行为,美观可读,所有表达式......
Guf*_*ffa 34
该Margin
属性返回一个Thickness
结构,其中Left
包含一个属性.该语句的作用是从Margin
属性复制结构值并Left
在副本上设置属性值.您收到错误,因为您设置的值不会存储回Margin
属性中.
(早期版本的C#只会让你在没有抱怨的情况下这样做,在新闻组和论坛中引起很多问题,为什么这样的声明根本没有效果...)
要设置属性,您需要Thickness
从Margin
属性中获取结构,设置值并将其存储回来:
Thickness m = MyControl.Margin;
m.Left = 10;
MyControl.Margin = m;
Run Code Online (Sandbox Code Playgroud)
如果要设置所有边距,只需创建一个Thickness
结构并立即设置它们:
MyControl.Margin = new Thickness(10, 10, 10, 10);
Run Code Online (Sandbox Code Playgroud)
Mar*_*ell 13
Margin
正在返回一个结构,这意味着您正在编辑副本.你需要这样的东西:
var margin = MyControl.Margin;
margin.Left = 10;
MyControl.Margin = margin;
Run Code Online (Sandbox Code Playgroud)
Luc*_*key 11
人们可以简单地使用它
MyControl.Margin = new System.Windows.Thickness(10, 0, 5, 0);
Run Code Online (Sandbox Code Playgroud)