코드에서 여백 속성 설정


82
MyControl.Margin.Left = 10;

오류:

'System.Windows.FrameworkElement.Margin'의 반환 값은 변수가 아니므로 수정할 수 없습니다.

답변:


138

문제는 Margin속성이고 해당 유형 ( Thickness)이 값 유형이라는 것입니다. 즉, 속성에 액세스 하면 값 의 복사본 을 다시 얻게 됩니다.

특정 값 (grr ... 변경 가능한 값 유형이 없어야 함) 에 대한 속성 값을 변경할 있지만 Thickness.Left여백은 변경되지 않습니다.

대신 Margin속성을 새 값 으로 설정해야 합니다. 예를 들어 (Marc가 작성한 것과 동일한 코드) :

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

라이브러리 디자인에 대한 참고 사항으로, Thickness변경 불가능한 경우 매우 선호 했지만 원본의 복사 본인 새 값을 반환했지만 한 부분이 교체 된 메서드를 사용했습니다. 그런 다음 다음과 같이 작성할 수 있습니다.

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

변경 가능한 값 유형의 이상한 동작, 멋지고 읽기 쉬운, 모두 하나의 표현식에 대해 걱정할 필요가 없습니다.


3
실제 유형을 찾는 것에 대한 찬사 ... 나는 속임수를 고백합니다 var-에헴, 죄송합니다; "적절한 언어 기능 사용"을 의미합니다. ;-p
Marc Gravell

1
오류 메시지에 정규화 된 형식 이름이 포함되어 있습니다. MSDN에 대한 빠른 북마크로, 난 그냥 ... 오른쪽 페이지에 도착하기 위해 주소 표시 줄에 "MSDN System.Windows.FrameworkElement.Margin"필요
존 소총을

Marc, zvolkov가 우리의 비밀을 발견했습니다! 하루에 200 명을 얻는 것이 너무 쉽다는 것이 밝혀 졌기 때문에 나는 더 많은 도전을하고 상위 2 명의 사용자를 확보하려고 노력할 것이라고 생각했습니다. 중재자로 "Marc"를 얻는 것은 단지 보너스였습니다 ...;)
Jon Skeet

그러나 우리 중 다른 사람들은 어떻습니까? 나 말이야? 그들은 "군단"대본에 대해 아직 알고 있습니까?
Marc Gravell

너희들이 재밌다고 덧붙여도 될까? StackOverflow 또는 다른 외부에서 함께 작업합니까? 당신은 모두 너무 추워요. 그것은 나를 외부인처럼 느끼게 만듭니다, 하하.
Giffyguy 2009-06-17

41

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);

13

Margin구조체를 반환합니다. 즉, 복사본을 편집하고 있음을 의미합니다 . 다음과 같은 것이 필요합니다.

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

(건배, 얼마 전에 수정되었습니다 ... 페이지 새로 고침이 필요하다고 생각합니다 ;-p)
Marc Gravell

11

간단히 사용할 수 있습니다.

MyControl.Margin = new System.Windows.Thickness(10, 0, 5, 0);

4

Margin이 개체를 가져오고 직접 변경할 수 없다는 것을 추측 할 수 있습니다 (그리고 내 WPF는 지금 약간 녹슬 었습니다).

예 :

MyControl.Margin = new Margin(10,0,0,0);

이 일을하지 않는 : 'System.Windows.FrameworkElement.Margin'는 '속성'이지만 '형'처럼 사용
토르 Klingberg

4

사용하려면 Thickness프로젝트 .NET framework플랫폼 버전을 4.5 로 생성 / 변경해야합니다 . 이 방법은 버전 4.5에서만 사용할 수 있기 때문입니다. (또한 .NET framework버전을 4.5로 생성 / 변경하지 않고 PresentationFramework.dll을 다운로드하고이 dll에 대한 참조를 제공 할 수 있습니다 .)

하지만 이렇게 간단하게하려면 다음 코드를 사용할 수 있습니다.

MyControl.Margin = new Padding(int left, int top, int right, int bottom);

또한

MyControl.Margin = new Padding(int all);

이것은 간단하며 프로젝트를 변경할 필요가 없습니다.


3

상황에 따라 여기서 패딩 속성을 사용해 볼 수도 있습니다.

MyControl.Margin=new Padding(0,0,0,0);

2

여백 = 새로운 두께 (0, 0, 0, 0);


코드에 대한 더 많은 설명이 좋을 것입니다. 단지 코드를 게시하지 마십시오.
Jackyef

0

무엇을 요구하고 있는지는 약간 불분명하지만, 편안하게하기 위해 자신의 Control을 상속하고 Marc가 제안한 코드로 속성을 추가 할 수 있습니다.

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

이러한 문제를 해결하기 위해 상속을 사용합니까? 꽤 큰 오버 헤드, 그렇지 않습니까?
LuckyLikey

@LuckyLikey는 유스 케이스에 따라 다릅니다 MerginLeft. 프로젝트의 여러 위치에서 변경하려는 경우 상속은 디자인 문제를 방지합니다. 물론 이것이 귀하의 프로젝트에서 단일 장소 인 경우 허용되는 답변을 선택합니다.
Jan Turoň
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.