MyControl.Margin.Left = 10;
Ошибка:
Невозможно изменить возвращаемое значение "System.Windows.FrameworkElement.Margin", потому что это не переменная
MyControl.Margin.Left = 10;
Ошибка:
Невозможно изменить возвращаемое значение "System.Windows.FrameworkElement.Margin", потому что это не переменная
Проблема заключается в том, что Margin
является свойством и его тип (Thickness
) - тип значения. Это означает, что когда вы получаете доступ к свойству, вы получаете копию значения обратно.
Даже если вы можете изменить значение свойства Thickness.Left
для определенного значения (grr... изменяемые типы значений не должны существует), это не изменит границу.
Вместо этого вам нужно установить для свойства Margin
новое значение. Например (по совпадению тот же код, что и Марк):
Thickness margin = MyControl.Margin;
margin.Left = 10;
MyControl.Margin = margin;
В качестве примечания для разработки библиотеки я бы предпочел бы ее, если Thickness
были неизменяемы, но с методами, которые возвратили новое значение, которое было копией оригинала, но с заменой одной части. Затем вы можете написать:
MyControl.Margin = MyControl.Margin.WithLeft(10);
Не стоит беспокоиться о нечетном поведении изменяемых типов значений, хорошем и читабельном, все одно выражение...
Свойство 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);
Margin
возвращает структуру, что означает, что вы редактируете копию. Вам понадобится что-то вроде:
var margin = MyControl.Margin;
margin.Left = 10;
MyControl.Margin = margin;
Можно просто использовать этот
MyControl.Margin = new System.Windows.Thickness(10, 0, 5, 0);
Можно догадаться, что (и мой WPF немного ржавый прямо сейчас), что Margin берет объект и не может быть напрямую изменен.
e.g
MyControl.Margin = new Margin(10,0,0,0);
Чтобы использовать 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);
Это просто и не нуждается в каких-либо изменениях в вашем проекте.
В зависимости от ситуации вы также можете попробовать использовать свойство padding здесь...
MyControl.Margin=new Padding(0,0,0,0);
Немного непонятно, что вы спрашиваете, но чтобы все было удобно, вы можете наследовать свой собственный элемент управления и добавить свойство с кодом, который предлагает Марк:
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