在代码中设置边距属性

Gif*_*guy 73 c# wpf margin

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)

不用担心可变值类型的奇怪行为,美观可读,所有表达式......

  • 查找实际类型的荣誉...我承认用`var`作弊 - 咳咳,对不起; 我的意思是"使用适当的语言功能";-p (3认同)

Guf*_*ffa 34

Margin属性返回一个Thickness结构,其中Left包含一个属性.该语句的作用是从Margin属性复制结构值并Left在副本上设置属性值.您收到错误,因为您设置的值不会存储回Margin属性中.

(早期版本的C#只会让你在没有抱怨的情况下这样做,在新闻组和论坛中引起很多问题,为什么这样的声明根本没有效果...)

要设置属性,您需要ThicknessMargin属性中获取结构,设置值并将其存储回来:

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)