在代码中设置保证金属性

MyControl.Margin.Left = 10; 

错误:

无法修改“System.Windows.FrameworkElement.Margin”的返回值,因为它不是一个variables

问题是Margin是一个属性,它的types( Thickness )是一个值types。 这意味着当您访问该属性时,您将获得该值的副本

即使您可以更改Thickness.Left属性值为特定的值(grr …可变值types不应该存在),它不会更改边距。

相反,您需要将Margin属性设置为新值。 例如(巧合的是,与Marc写的代码相同):

 Thickness margin = MyControl.Margin; margin.Left = 10; MyControl.Margin = margin; 

作为库devise的一个注释,如果Thickness是不可变的,我会非常喜欢它,但是用方法返回一个新的值,这个值是原来的一个副本,但是一个部分被replace了。 然后你可以写:

 MyControl.Margin = MyControl.Margin.WithLeft(10); 

不用担心可变值types的奇怪行为,漂亮可读,所有的expression式…

Margin属性返回一个Thickness结构,其中Left是一个属性。 声明所做的是复制Margin属性中的结构值,并在副本上设置Left属性值。 你得到一个错误,因为你设置的值不会被存回到Margin属性中。

(C#的早期版本只是让你不抱怨,在新闻组和论坛上引发了很多问题,为什么这样的陈述根本没有效果……)

要设置属性,您需要从Margin属性中获取Thickness结构,设置该值并将其存储回去:

 Thickness m = MyControl.Margin; m.Left = 10; MyControl.Margin = m; 

如果要设置所有边距,只需创build一个Thickness结构并将其全部设置为一次:

 MyControl.Margin = new Thickness(10, 10, 10, 10); 

Margin返回一个结构,这意味着你正在编辑一个副本 。 你将需要像这样的东西:

 var margin = MyControl.Margin; margin.Left = 10; MyControl.Margin = margin; 

人们可以简单地使用这个

 MyControl.Margin = new System.Windows.Thickness(10, 0, 5, 0); 

人们会猜测(我的WPF现在有点生疏),Margin需要一个对象,不能直接改变。

例如

 MyControl.Margin = new Margin(10,0,0,0); 

要使用Thickness您需要创build/更改您的项目.NET framework平台版本到4.5。 因为此方法仅在版本4.5中可用。 (你也可以直接下载PresentationFramework.dll并给这个dll参考,而不需要创build/更改你的.NET framework版本到4.5。)

但是如果你想这样做简单,你可以使用下面的代码:

 MyControl.Margin = new Padding(int left, int top, int right, int bottom); 

 MyControl.Margin = new Padding(int all); 

这很简单,不需要对您的项目进行任何更改

取决于情况,你也可以尝试在这里使用填充属性…

 MyControl.Margin=new Padding(0,0,0,0); 

有点不清楚你在问什么,但为了让事情变得舒适,你可以inheritance自己的控制,并添加一个属性与马克build议的代码:

 class MyImage : Image { private Thickness thickness; public double MarginLeft { get { return Margin.Left; } set { thickness = Margin; thickness.Left = value; Margin = thickness; } } } 

然后在客户端代码中,您可以只写

 MyImage img = new MyImage(); img.MarginLeft = 10; MessageBox.Show(img.Margin.Left.ToString()); // or img.MarginLeft