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- гм, вибачте; Я маю на увазі "використання відповідної мовної функції";