Вопрос

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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top