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);
이것은 간단하며 프로젝트를 변경할 필요가 없습니다.
무엇을 요구하고 있는지는 약간 불분명하지만, 편안하게하기 위해 자신의 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
MerginLeft
. 프로젝트의 여러 위치에서 변경하려는 경우 상속은 디자인 문제를 방지합니다. 물론 이것이 귀하의 프로젝트에서 단일 장소 인 경우 허용되는 답변을 선택합니다.
var
-에헴, 죄송합니다; "적절한 언어 기능 사용"을 의미합니다. ;-p