68

Вопрос по c#, wpf – Установка свойств полей в коде

MyControl.Margin.Left = 10;

Ошибка:

Cannot modify the return value of 'System.Windows.FrameworkElement.Margin' because it is not a variable

9ответов

1

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

2

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

MyControl.Margin=new Padding(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
12

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

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

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

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

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

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

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

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

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

33

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

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

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

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

например

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

Использовать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);

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

RelatedQuestions