MyControl.Margin.Left = 10;
Error:
无法修改 'System.Windows.FrameworkElement.Margin' 的返回值,因为它不是一个变量
Margin
是一个属性,而它的类型(Thickness
)是一个值类型。这意味着当您访问该属性时,您会得到一个值的副本。Thickness.Left
属性的值(grr…可变值类型不应存在),它也不会更改边距。Margin
属性设置为新值。例如(巧合的是,与Marc编写的代码相同):Thickness margin = MyControl.Margin;
margin.Left = 10;
MyControl.Margin = margin;
Thickness
是不可变的,但是有方法返回一个新值,该值是原始值的副本,但其中的一部分被替换。然后你可以这样写:MyControl.Margin = MyControl.Margin.WithLeft(10);
Margin
属性返回一个Thickness
结构,其中Left
是一个属性。该语句的作用是从Margin
属性中复制结构值,并在副本上设置Left
属性值。您会收到错误提示,因为您设置的值不会存储回Margin
属性中。
(早期版本的C#允许您这样做而不发出警告,导致新闻组和论坛上出现很多关于为什么这样的语句根本没有效果的问题...)
要设置属性,您需要从Margin
属性获取Thickness
结构,设置值并将其存储回去:
Thickness m = MyControl.Margin;
m.Left = 10;
MyControl.Margin = m;
如果你将要设置所有的边距,只需要创建一个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);
根据情况,您也可以尝试在此处使用padding属性...
MyControl.Margin=new Padding(0,0,0,0);
要使用 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);
also
MyControl.Margin = new Padding(int all);
据我猜测(我的WPF现在有点生疏),Margin采用对象,不能直接更改。
例如:
MyControl.Margin = new Margin(10,0,0,0);
Margin = new Thickness(0, 0, 0, 0);
不太清楚你在问什么,但为了让事情更方便,您可以继承自己的控件并添加一个具有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
MerginLeft
,那么继承可以避免设计问题。当然,如果这只是你的项目中的一个地方,我会选择接受的答案。 - Jan Turoň
var
这个“作弊”的东西-啊咳,抱歉;我是说“使用了一个适当的语言特性”;-p - Marc Gravell