在代码中设置边距属性

时间:2009-06-16 20:26:32

标签: c# wpf margin

MyControl.Margin.Left = 10;

错误:

  

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

8 个答案:

答案 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