Установка свойств полей в коде - PullRequest
70 голосов
/ 17 июня 2009
MyControl.Margin.Left = 10;

Ошибка:

Невозможно изменить возвращаемое значение 'System.Windows.FrameworkElement.Margin', поскольку оно не является переменной

Ответы [ 9 ]

122 голосов
/ 17 июня 2009

Проблема в том, что Margin является свойством, а его тип (Thickness) является типом значения. Это означает, что при доступе к свойству вы получаете копию значения обратно.

Даже если вы можете изменить значение свойства Thickness.Left для определенного значения (grr ... типы изменяемых значений не должны существовать), оно не будет изменить маржу.

Вместо этого вам нужно установить для свойства Margin новое значение. Например (по совпадению тот же код, что и Марк):

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

В качестве примечания по дизайну библиотеки, я бы предпочел его, если бы Thickness были неизменяемыми, но с методами, которые возвращали новое значение, которое было копией оригинала, но с заменой одной части. Тогда вы могли бы написать:

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

Не беспокойтесь о странном поведении изменяемых типов значений, хороших и читаемых, все одно выражение ...

34 голосов
/ 17 июня 2009

Свойство 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);
13 голосов
/ 17 июня 2009

Margin возвращает структуру, что означает, что вы редактируете копию . Вам понадобится что-то вроде:

var margin = MyControl.Margin;
margin.Left = 10;
MyControl.Margin = margin;
12 голосов
/ 22 апреля 2015

Можно просто использовать это

MyControl.Margin = new System.Windows.Thickness(10, 0, 5, 0);
5 голосов
/ 17 июня 2009

Можно предположить, что (и мой WPF сейчас немного ржавый), что Margin берет объект и не может быть напрямую изменен.

например,

MyControl.Margin = new Margin(10,0,0,0);
4 голосов
/ 25 февраля 2014

Чтобы использовать 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);

Это просто и не требует каких-либо изменений в вашем проекте

2 голосов
/ 07 июня 2018

Маржа = новая толщина (0, 0, 0, 0);

2 голосов
/ 06 октября 2015

Зависит от ситуации, вы также можете попробовать использовать свойство padding здесь ...

MyControl.Margin=new Padding(0,0,0,0);
0 голосов
/ 03 июля 2014

Немного неясно, что вы спрашиваете, но для удобства вы можете унаследовать свой собственный элемент управления и добавить свойство с кодом, который предлагает Марк:

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
...