WPF 단위 및 코드 숨김
-
14-11-2019 - |
문제
최근에 저는 WPF가 XAML에서 다양한 측정 단위를 지원한다는 사실을 발견했습니다.기본 DIP 외에도 (내가 아는 한) 픽셀, 인치, 센티미터에 대한 지원도 있습니다.이를 통해 디자이너는 다음과 같은 XAML을 작성할 수 있습니다.
<Canvas>
<Line X1="0cm" X2="3cm" Y1="1cm" Y2="3cm" Stroke="Black"/>
</Canvas>
그러나 이러한 값을 바인딩할 수는 없습니다.예를 들어 "7cm"와 같은 문자열인 Dimension 속성이 있는 ViewModel이 있다고 가정해 보겠습니다.다음은 작동하지 않습니다:
<Button Width="{Binding Dimension}">Test</Button>
FormatException이 발생합니다.마찬가지로, FrameworkElement
코드 숨김에서는 다음과 같습니다.
Canvas1.Children.Add(new Button() { Width = "3cm", Content = "Test"});
컨트롤을 만들려고 할 때마다 생성자/어디에서나 예외가 발생하기 때문에 컴파일이 실패합니다.
나는 궁금하다:
- 코드 숨김에서 자연 단위(제 경우에는 미터법 - 센티미터)를 사용할 수 있습니까?
- 어떻게?
- WPF/XAML이 지원하는 전체 단위 목록이 있습니까?
편집하다:
다음은 이 질문을 해결하는 아래 의견의 링크입니다.
http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.width.aspx
해결책
XAML 파서가 사용하는 것과 동일한 변환을 적용하여 코드 뒤에서 이 작업을 수행할 수 있습니다. 문자열을 전달해도 괜찮다면 이 논리를 다시 구현할 필요가 없습니다.
button.Width = (double)new LengthConverter().ConvertFrom("2cm");
XAML 파서는 다음을 사용합니다. 유형 변환기 문자열을 필요한 값으로 변환하려면 문서 페이지의 Width
재산 당신은 그것이 가지고 있음을 볼 수 있습니다 TypeConverterAttribute
다음을 지정 LengthConverter
사용되어야한다.이 특성은 속성을 처리하는 방법을 로컬에서 재정의하는 데 사용할 수 있지만 클래스 수준에서도 적용할 수 있습니다. Employee
클래스에는 다음을 지정하는 이 속성이 있습니다. EmployeeConverter
해당 변환기를 사용해야 합니다. 해당 변환기는 유형 속성의 기본값이 됩니다. Employee
.
바인딩이 이 유형 변환기를 적용하지 않지만 내부에서 사용한다는 사실에 조금 놀랐습니다. IValueConverter
충분히 간단할 것입니다. 실제로 마크업 확장 이는 IValueConverter
유형 변환기를 사용하여 멋지게 일반화합니다.
다른 팁
1) 및 2)의 경우 DIP는 장치 독립적이므로 문제 없이 "자연 단위"를 계산할 수 있습니다.(부자연스러운) 장치 종속 픽셀은 예외입니다.
만들기 가치 변환기 문자열 값을 원하는 단위가 문자열에 지정될 수 있는 double로 변환합니다.그런 다음 바인딩에서 ValueConverter를 사용하고 ViewModel에서 "자연 단위"로 계산할 수 있습니다.
3) 및 구현의 경우:나는 빨리 구글링을 해봤지만 아무것도 찾지 못했지만, 더 깊이 검색해 보면 뭔가가 나타날 것입니다.그렇지 않으면 자신만의 변환기를 만드는 것이 그리 어렵지 않을 것입니다.다음은 몇 가지 변환 정보입니다.
96DIP == 1inch == 2.54cm;
1cm == 37.8DIP;
1zoll == 1inch == 2.54cm;