[c#] 코드에서 여백 속성 설정

MyControl.Margin.Left = 10;

오류:

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



답변

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

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

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

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


답변

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

예 :

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


답변

사용하려면 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);

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


답변

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

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