【问题标题】:Setting Margin Properties in code在代码中设置边距属性
【发布时间】:2010-11-03 11:27:25
【问题描述】:
MyControl.Margin.Left = 10;

错误:

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

【问题讨论】:

    标签: c# wpf margin


    【解决方案1】:

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

    例如

    MyControl.Margin = new Margin(10,0,0,0);
    

    【讨论】:

    • 这不起作用:'System.Windows.FrameworkElement.Margin' 是一个“属性”,但用作“类型”
    【解决方案2】:

    Margin 正在返回一个结构,这意味着您正在编辑一个副本。您将需要以下内容:

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

    【讨论】:

    • (干杯,前段时间修复...我希望您需要刷新页面;-p)
    【解决方案3】:

    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 正是我想要同时修改 MarginPadding 属性时搜索的内容。我敢打赌这也适用于BorderThickness。谢谢!!
    【解决方案4】:

    问题是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
    • 这有助于错误消息包含完全限定的类型名称。使用 MSDN 的快速书签,我只需要地址栏上的“msdn System.Windows.FrameworkElement.Margin”即可到达正确的页面...
    • 马克,兹沃尔科夫发现了我们的秘密!事实证明,一天获得 200 个用户太容易了,所以我想我应该给自己设置更多的挑战,并尝试获得前 2 名用户。让“Marc”成为主持人只是一个奖励......;)
    • 但是我们其他人呢?我是说我吗?他们知道“军团”剧本吗?
    • 我可以补充一下你们很搞笑吗?你在 StackOverflow 之外一起工作吗?你们都那么亲密——这让我觉得自己像个局外人,哈哈。
    【解决方案5】:

    要使用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);
    

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

    【讨论】:

      【解决方案6】:

      有点不清楚你在问什么,但为了让事情更舒服,你可以继承自己的 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
      

      【讨论】:

      • 使用继承来解决这样的问题?相当大的开销,不是吗?
      • @LuckyLikey 它取决于用例:如果您计划在项目中的多个位置更改MerginLeft,继承可以避免设计问题。当然,如果这是您项目中的一个地方,我会选择接受的答案。
      【解决方案7】:

      人们可以简单地使用它

      MyControl.Margin = new System.Windows.Thickness(10, 0, 5, 0);
      

      【讨论】:

        【解决方案8】:

        视情况而定,你也可以在这里尝试使用 padding 属性...

        MyControl.Margin=new Padding(0,0,0,0);
        

        【讨论】:

          【解决方案9】:

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

          【讨论】:

          • 更多关于你的代码的解释会很好。请不要只发布代码。
          猜你喜欢
          • 2012-02-24
          • 2012-10-01
          • 2012-11-28
          • 2011-02-02
          • 1970-01-01
          • 1970-01-01
          • 2013-06-24
          • 2020-04-27
          • 2011-06-16
          相关资源
          最近更新 更多