【发布时间】:2010-11-03 11:27:25
【问题描述】:
MyControl.Margin.Left = 10;
错误:
不能修改'System.Windows.FrameworkElement.Margin'的返回值,因为它不是变量
【问题讨论】:
MyControl.Margin.Left = 10;
错误:
不能修改'System.Windows.FrameworkElement.Margin'的返回值,因为它不是变量
【问题讨论】:
有人会猜测(我的 WPF 现在有点生疏了)Margin 接受一个对象并且不能直接更改。
例如
MyControl.Margin = new Margin(10,0,0,0);
【讨论】:
Margin 正在返回一个结构,这意味着您正在编辑一个副本。您将需要以下内容:
var margin = MyControl.Margin;
margin.Left = 10;
MyControl.Margin = margin;
【讨论】:
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);
【讨论】:
New Thickness 正是我想要同时修改 Margin 和 Padding 属性时搜索的内容。我敢打赌这也适用于BorderThickness。谢谢!!
问题是Margin是一个属性,它的类型(Thickness)是一个值类型。这意味着当您访问该属性时,您将获得该值的副本。
即使您可以将Thickness.Left 属性的值更改为特定值(grr... 可变值类型不应该存在),它不会更改边距。
相反,您需要将Margin 属性设置为新值。例如(巧合的是和 Marc 写的代码一样):
Thickness margin = MyControl.Margin;
margin.Left = 10;
MyControl.Margin = margin;
作为库设计的说明,如果Thickness 是不可变的,但使用返回新值的方法,该值是原始值的副本,但有一部分被替换,我会非常喜欢它。然后你可以写:
MyControl.Margin = MyControl.Margin.WithLeft(10);
不用担心可变值类型的奇怪行为,美观且可读,所有一个表达式...
【讨论】:
var 作弊 - 咳咳,对不起;我的意思是“使用适当的语言功能”;-p
要使用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,继承可以避免设计问题。当然,如果这是您项目中的一个地方,我会选择接受的答案。
人们可以简单地使用它
MyControl.Margin = new System.Windows.Thickness(10, 0, 5, 0);
【讨论】:
视情况而定,你也可以在这里尝试使用 padding 属性...
MyControl.Margin=new Padding(0,0,0,0);
【讨论】:
边距 = 新厚度(0, 0, 0, 0);
【讨论】: