MyControl.Margin.Left = 10;
错误:
无法修改'System.Windows.FrameworkElement.Margin'的返回值,因为它不是变量
答案 0 :(得分:120)
问题是Margin
是属性,其类型(Thickness
)是值类型。这意味着当您访问该属性时,您将获得该值的副本。
即使可以更改特定值的Thickness.Left
属性值(grr ...不应存在可变值类型),也不会改变边距
相反,您需要将Margin
属性设置为新值。例如(巧合的是与Marc写的相同的代码):
Thickness margin = MyControl.Margin;
margin.Left = 10;
MyControl.Margin = margin;
作为图书馆设计的一个注释,如果Thickness
是不可变的,我会非常喜欢它,但是使用返回新值的方法,该值是原始版本的副本,但是替换了一个部分。然后你可以写:
MyControl.Margin = MyControl.Margin.WithLeft(10);
不要担心可变值类型的奇怪行为,不错且可读,所有表达式都是......
答案 1 :(得分:34)
Margin
属性返回Thickness
结构,其中Left
是属性。该语句的作用是从Margin
属性复制结构值并在副本上设置Left
属性值。您收到错误,因为您设置的值不会存储回Margin
属性。
(早期版本的C#只会让你在没有抱怨的情况下做到这一点,在新闻组和论坛中引起很多问题,为什么像这样的声明根本没有效果......)
要设置属性,您需要从Thickness
属性获取Margin
结构,设置值并将其存储回来:
Thickness m = MyControl.Margin;
m.Left = 10;
MyControl.Margin = m;
如果您要设置所有边距,只需创建一个Thickness
结构并立即设置它们:
MyControl.Margin = new Thickness(10, 10, 10, 10);
答案 2 :(得分:13)
Margin
正在返回一个结构,这意味着您正在编辑副本。你需要这样的东西:
var margin = MyControl.Margin;
margin.Left = 10;
MyControl.Margin = margin;
答案 3 :(得分:5)
有人会猜测(而且我的WPF现在有点生疏)Margin会占用一个对象并且无法直接更改。
例如
MyControl.Margin = new Margin(10,0,0,0);
答案 4 :(得分:4)
要使用Thickness
,您需要创建/更改项目.NET framework
平台版本为4.5。因为这种方法仅在4.5版本中可用。 (您也可以下载PresentationFramework.dll并参考此dll,而无需创建/更改您的.NET framework
版本为4.5。)
但是如果你想这么做,你可以使用这段代码:
MyControl.Margin = new Padding(int left, int top, int right, int bottom);
也
MyControl.Margin = new Padding(int all);
这很简单,不需要对项目进行任何更改
答案 5 :(得分:2)
取决于具体情况,你也可以尝试在这里使用填充属性......
MyControl.Margin=new Padding(0,0,0,0);
答案 6 :(得分:1)
Margin = new Thickness(0,0,0,0);
答案 7 :(得分:0)
有点不清楚你在问什么,但为了让事情变得舒适,你可以继承你自己的Control并添加一个Marc建议代码的属性:
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