MyControl.Margin.Left = 10;
错误:
无法修改'System.Windows.FrameworkElement.Margin'的返回值,因为它不是变量
Answers:
问题在于这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#可以让您毫无抱怨地进行操作,这在新闻组和论坛中引发了很多问题,为什么这样的声明根本没有效果...)
要设置属性,您需要Thickness
从Margin
属性中获取结构,设置值并将其存储回去:
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;
有人会猜测(并且我的WPF现在有点生锈)Margin占用了一个对象,无法直接更改。
例如
MyControl.Margin = new Margin(10,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);
也
MyControl.Margin = new Padding(int all);
这很简单,不需要对项目进行任何更改
不清楚您要问的是什么,但是为了使事情变得舒适,您可以继承自己的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
MerginLeft
在项目中的多个位置进行更改,则继承可以避免设计问题。当然,如果这是您项目中的一个地方,我会选择接受的答案。
var
-抱歉,对不起;我的意思是“使用适当的语言功能” ;-p