Настройка свойств полей в коде
Вопрос
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
собственность.
(Более ранние версии C # просто позволяли вам делать это без жалоб, вызывая множество вопросов в группах новостей и форумах о том, почему подобное утверждение вообще не имело никакого эффекта ...)
Чтобы установить свойство, вам нужно будет получить 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 сейчас немного заржавел) это поле принимает объект и не может быть изменено напрямую.
например, 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);
Запас = новая толщина (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