MyControl.Margin.Left = 10;
Błąd:
Nie można zmodyfikować wartości zwracanej „System.Windows.FrameworkElement.Margin”, ponieważ nie jest to zmienna
Odpowiedzi:
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 ...
Margin
Właściwość zwraca Thickness
strukturę, z której Left
jest nieruchomość. Instrukcja kopiuje wartość struktury z Margin
właściwości i ustawia Left
wartość właściwości w kopii. Pojawia się błąd, ponieważ ustawiona wartość nie zostanie z powrotem zapisana we Margin
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ę z Margin
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);
Margin
zwraca strukturę, co oznacza, że edytujesz kopię . Będziesz potrzebował czegoś takiego:
var margin = MyControl.Margin;
margin.Left = 10;
MyControl.Margin = margin;
Można tego po prostu użyć
MyControl.Margin = new System.Windows.Thickness(10, 0, 5, 0);
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);
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
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
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ź.
var
- ahem, przepraszam; Mam na myśli „używanie odpowiedniej funkcji językowej” ;-p