Ustawianie właściwości marginesu w kodzie

MyControl.Margin.Left = 10;

Błąd:

Nie można modyfikować wartości zwracanej ' System.Okna./ Align = "left" / Margin' ponieważ nie jest zmienną

Author: H.B., 2009-06-17

9 answers

Problem polega na tym, że Margin jest nieruchomością, a jej rodzaj (Thickness) jest typem wartości. Oznacza to, że po uzyskaniu dostępu do właściwości otrzymujesz kopię wartości z powrotem.

Nawet jeśli Możesz zmienić wartość Thickness.Left właściwość dla określonej wartości (gr... zmienne typy wartości nie powinny istnieć), nie zmieniłoby to marginesu.

Zamiast tego musisz ustawić właściwość Margin na nową wartość. Na przykład (przypadkowo ten sam kod Co Marc napisał):

Thickness margin = MyControl.Margin;
margin.Left = 10;
MyControl.Margin = margin;

Jako uwaga do projektowania bibliotek, zdecydowanie wolałbym, żeby Thickness były niezmienne, ale z metodami, które zwracają nową wartość, która jest kopią oryginału, ale z jedną częścią zastąpioną. Wtedy możesz napisać:

MyControl.Margin = MyControl.Margin.WithLeft(10);

Nie martw się dziwnym zachowaniem zmiennych typów wartości, ładne i czytelne, wszystko jedno wyrażenie...

 113
Author: Jon Skeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-16 20:33:40

Właściwość Margin zwraca strukturę Thickness, której Left jest właściwością. Polecenie to kopiuje wartość struktury z właściwości Margin i ustawia wartość właściwości Left na kopii. Pojawia się błąd, ponieważ ustawiona wartość nie zostanie zapisana z powrotem do właściwości Margin.

(wcześniejsze wersje C# pozwoliłyby ci to zrobić bez narzekania, powodując wiele pytań w grupach dyskusyjnych i forach na temat tego, dlaczego takie stwierdzenie nie miało wpływu na wszystkie...)

Aby ustawić właściwość, należy pobrać strukturę Thickness z właściwości Margin, ustawić wartość i zapisać ją z powrotem:

Thickness m = MyControl.Margin;
m.Left = 10;
MyControl.Margin = m;

Jeśli chcesz ustawić wszystkie marginesy, po prostu utwórz strukturę Thickness i ustaw je wszystkie na raz:

MyControl.Margin = new Thickness(10, 10, 10, 10);
 33
Author: Guffa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-16 20:32:21

Margin zwraca strukturę, co oznacza, że edytujesz kopię . Będziesz potrzebował czegoś takiego jak:

var margin = MyControl.Margin;
margin.Left = 10;
MyControl.Margin = margin;
 13
Author: Marc Gravell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-16 20:30:20

Można po prostu użyć tego

MyControl.Margin = new System.Windows.Thickness(10, 0, 5, 0);
 11
Author: LuckyLikey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-22 08:41:59

Można by się domyślić, że (a mój WPF jest teraz trochę zardzewiały) ten margines zajmuje obiekt i nie można go bezpośrednio zmienić.

E. g

MyControl.Margin = new Margin(10,0,0,0);
 5
Author: Ash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-16 20:29:34

Aby użyć Thickness Musisz utworzyć/zmienić wersję projektu .NET framework Na 4.5. ponieważ metoda ta jest dostępna tylko w wersji 4.5. (Również można po prostu pobrać PresentationFramework.dll i dać referense do tej biblioteki dll, bez tworzenia/zmiany wersji .NET framework Na 4.5.)

Ale jeśli chcesz zrobić to proste, 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 projekcie

 4
Author: Daler Tursunov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-25 13:27:01

W zależności od sytuacji, możesz również spróbować użyć właściwości padding tutaj...

MyControl.Margin=new Padding(0,0,0,0);
 2
Author: Rishi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-06 08:20:58

Jest trochę niejasne o co prosisz, ale aby było wygodniej, możesz odziedziczyć własną kontrolę i dodać właściwość z kodem, który sugeruje 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ć tylko

MyImage img = new MyImage();
img.MarginLeft = 10;
MessageBox.Show(img.Margin.Left.ToString()); // or img.MarginLeft
 0
Author: Jan Turoň,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-03 09:39:57

Margin = New Thickness(0, 0, 0, 0);

 0
Author: KalleP,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-07 08:43:24