Настройка свойств поля в коде

MyControl.Margin.Left = 10;

Ошибка:

Невозможно изменить возвращаемое значение "System.Windows.FrameworkElement.Margin", потому что это не переменная

Ответ 1

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

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

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

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

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

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

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

Ответ 2

Свойство Margin возвращает структуру Thickness, из которых Left является свойством. То, что делает оператор, это копирование значения структуры из свойства Margin и установка значения свойства Left на копии. Вы получите сообщение об ошибке, поскольку указанное значение не будет сохранено в свойстве Margin.

(Более ранние версии С# просто позволили вам сделать это без жалоб, вызвав много вопросов в новостных группах и форумах о том, почему подобное выражение не имело никакого эффекта...)

Чтобы установить свойство, вам нужно получить структуру Thickness из свойства Margin, установить значение и сохранить его обратно:

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

Если вы собираетесь установить все поля, просто создайте структуру Thickness и установите их сразу:

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

e.g

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

Ответ 6

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

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

Ответ 7

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

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

Ответ 8

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

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