문제

최근에 저는 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;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top