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 зараз трохи іржавий), що Margin бере об’єкт і не може бути безпосередньо змінений.
напр
MyControl.Margin = new Margin(10,0,0,0);
Для використання Thickness
вам потрібно створити / змінити .NET framework
версію платформи проекту на 4.5. Оскільки цей метод доступний лише у версії 4.5. (Також ви можете просто завантажити PresentationFramework.dll і надати посилання на цю бібліотеку без створення / зміни вашої .NET framework
версії на 4.5.)
Але якщо ви хочете зробити це просто, ви можете скористатися таким кодом:
MyControl.Margin = new Padding(int left, int top, int right, int bottom);
також
MyControl.Margin = new Padding(int all);
Це просто і не потребує жодних змін у вашому проекті
Трохи незрозуміло, про що ви питаєте, але, щоб зробити все комфортно, ви можете успадкувати власний Control і додати властивість із кодом, який пропонує Марк:
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
MerginLeft
декілька місць у проекті, успадкування дозволяє уникнути проблем із дизайном. Звичайно, якщо це єдине місце у вашому проекті, я б обрав прийняту відповідь.
var
- гм, вибачте; Я маю на увазі "використання відповідної мовної функції";