在代码中设置保证金属性
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