MyControl.Margin.Left = 10;
Błąd:
Nie można zmodyfikować wartości zwracanej „System.Windows.FrameworkElement.Margin”, ponieważ nie jest to zmienna
Problem polega na tym, że Margin
jest to właściwość, a jej type ( Thickness
) jest typem wartości. Oznacza to, że kiedy uzyskujesz dostęp do właściwości, otrzymujesz kopię wartości z powrotem.
Nawet jeśli może zmienić wartość Thickness.Left
właściwości dla określonej wartości (grr ... Zmienne typy wartości nie powinien istnieć), nie byłoby zmienić margines.
Zamiast tego musisz ustawić Margin
właściwość na nową wartość. Na przykład (przypadkowo ten sam kod, który napisał Marc):
Thickness margin = MyControl.Margin;
margin.Left = 10;
MyControl.Margin = margin;
Jako uwaga na temat projektowania bibliotek, zdecydowanie wolałbym, aby Thickness
był niezmienny, ale z metodami, które zwracały nową wartość, która była kopią oryginału, ale z zastąpioną jedną częścią. Wtedy możesz napisać:
MyControl.Margin = MyControl.Margin.WithLeft(10);
Nie martw się o dziwne zachowanie zmiennych typów wartości, ładne i czytelne, wszystko jedno wyrażenie ...
var
- ahem, przepraszam; Mam na myśli „używanie odpowiedniej funkcji językowej” ;-pMargin
Właściwość zwracaThickness
strukturę, z którejLeft
jest nieruchomość. Instrukcja kopiuje wartość struktury zMargin
właściwości i ustawiaLeft
wartość właściwości w kopii. Pojawia się błąd, ponieważ ustawiona wartość nie zostanie z powrotem zapisana weMargin
właściwości.(Wcześniejsze wersje C # po prostu pozwoliłyby ci to zrobić bez narzekania, powodując wiele pytań w grupach dyskusyjnych i forach o to, dlaczego takie oświadczenie nie ma żadnego wpływu ...)
Aby ustawić właściwość, musisz pobrać
Thickness
strukturę zMargin
właściwości, ustawić wartość i zapisać ją z powrotem:Thickness m = MyControl.Margin; m.Left = 10; MyControl.Margin = m;
Jeśli zamierzasz ustawić wszystkie marginesy, po prostu utwórz
Thickness
strukturę i ustaw je wszystkie naraz:MyControl.Margin = new Thickness(10, 10, 10, 10);
źródło
Margin
zwraca strukturę, co oznacza, że edytujesz kopię . Będziesz potrzebował czegoś takiego:var margin = MyControl.Margin; margin.Left = 10; MyControl.Margin = margin;
źródło
Można tego po prostu użyć
MyControl.Margin = new System.Windows.Thickness(10, 0, 5, 0);
źródło
Można by zgadywać (a mój WPF jest teraz trochę zardzewiały), że Margin pobiera obiekt i nie można go bezpośrednio zmienić.
na przykład
MyControl.Margin = new Margin(10,0,0,0);
źródło
Aby skorzystać
Thickness
, musisz utworzyć / zmienić.NET framework
wersję platformy projektu na 4.5. ponieważ ta metoda jest dostępna tylko w wersji 4.5. (Możesz także po prostu pobrać PresentationFramework.dll i podać odwołanie do tej biblioteki dll, bez tworzenia / zmiany pliku.NET framework
wersji do 4.5).Ale jeśli chcesz zrobić to prosto, możesz użyć tego kodu:
MyControl.Margin = new Padding(int left, int top, int right, int bottom);
również
MyControl.Margin = new Padding(int all);
Jest to proste i nie wymaga żadnych zmian w Twoim projekcie
źródło
W zależności od sytuacji możesz również spróbować użyć właściwości dopełniania tutaj ...
MyControl.Margin=new Padding(0,0,0,0);
źródło
Margines = nowa Grubość (0, 0, 0, 0);
źródło
Trochę niejasne jest, o co prosisz, ale aby wszystko było wygodne, możesz odziedziczyć własną Control i dodać właściwość z kodem sugerowanym przez Marc:
class MyImage : Image { private Thickness thickness; public double MarginLeft { get { return Margin.Left; } set { thickness = Margin; thickness.Left = value; Margin = thickness; } } }
Następnie w kodzie klienta możesz napisać po prostu
MyImage img = new MyImage(); img.MarginLeft = 10; MessageBox.Show(img.Margin.Left.ToString()); // or img.MarginLeft
źródło
MerginLeft
w wielu miejscach w projekcie, dziedziczenie pozwala uniknąć problemów projektowych. Oczywiście, jeśli jest to jedno miejsce w Twoim projekcie, wybrałbym akceptowaną odpowiedź.