86
MyControl.Margin.Left = 10;

错误:

无法修改“System.Windows.FrameworkElement.Margin”的返回值,因为它不是变量

4

9 回答 9

144

问题是它Margin是一个属性,它的类型 ( Thickness) 是一个值类型。这意味着当您访问该属性时,您将获得该值的副本

即使您可以更改Thickness.Left特定值的属性值(grr... 可变值类型不应该存在),它也不会更改边距。

相反,您需要将该Margin属性设置为新值。例如(巧合的是,与 Marc 写的代码相同):

Thickness margin = MyControl.Margin;
margin.Left = 10;
MyControl.Margin = margin;

作为库设计的一个说明,如果它Thickness是不可变的,我会非常喜欢它,但它的方法返回一个新值,该值是原始值的副本,但有一部分被替换。然后你可以写:

MyControl.Margin = MyControl.Margin.WithLeft(10);

不用担心可变值类型的奇怪行为,美观且可读,所有一个表达式......

于 2009-06-16T20:33:40.607 回答
45

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);
于 2009-06-16T20:32:21.467 回答
14

Margin正在返回一个结构,这意味着您正在编辑一个副本。您将需要类似的东西:

var margin = MyControl.Margin;
margin.Left = 10;
MyControl.Margin = margin;
于 2009-06-16T20:30:20.380 回答
14

可以简单地使用这个

MyControl.Margin = new System.Windows.Thickness(10, 0, 5, 0);
于 2015-04-22T08:41:59.830 回答
4

有人会猜测(我的 WPF 现在有点生疏) Margin 接受一个对象并且不能直接更改。

例如

MyControl.Margin = new Margin(10,0,0,0);
于 2009-06-16T20:29:34.017 回答
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);

这很简单,不需要对您的项目进行任何更改

于 2014-02-25T13:27:01.133 回答
4

视情况而定,您也可以尝试在此处使用填充属性...

MyControl.Margin=new Padding(0,0,0,0);
于 2015-10-06T08:03:47.423 回答
3

边距 = 新厚度 (0, 0, 0, 0);

于 2018-06-07T08:43:24.560 回答
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
于 2014-07-03T09:39:57.230 回答