2012-02-29 2 views
14

최근 WPF에서 XAML의 다양한 측정 단위를 지원한다는 사실을 알았습니다. 기본 DIP 외에도 픽셀, 인치 및 센티미터에 대한 지원도 있습니다 (아는 한). 디자이너는 다음과 같이 XAML을 작성할 수 있습니다.WPF 단위 및 코드 숨김

<Canvas> 
    <Line X1="0cm" X2="3cm" Y1="1cm" Y2="3cm" Stroke="Black"/> 
</Canvas> 

그러나 이러한 값은 바인딩 할 수 없습니다. 예를 들어 "7cm"와 같이 문자열 인 Dimension 속성을 가진 ViewModel이 있다고 상상해보십시오. 다음은 작동하지 않습니다.

<Button Width="{Binding Dimension}">Test</Button> 

FormatException이 throw됩니다. 이 같은 코드 숨김에서 FrameworkElement을 만들 때 마찬가지로 : 당신이 컨트롤을 만들려고 할 때마다 예외가/생성자에서 발생하기 때문에

Canvas1.Children.Add(new Button() { Width = "3cm", Content = "Test"}); 

컴파일이 실패합니다.

이 궁금 :

  • 이 (내 경우 메트릭에서 - cm) 자연 단위를 사용하는 것이 가능 코드 숨김에서?
  • 어떻게?
  • WPF/XAML이 지원하는 단위의 전체 목록이 있습니까?

편집 : 여기

이 문제 해결 아래 주석에서 링크 : 1의 경우

http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.width.aspx

답변

13

당신은 코드에서이 작업을 수행 할 수 있습니다 뒤에 XAML 파서가 사용하는 것과 동일한 변환을 적용하여,이 논리를 구현할 필요가 없습니다 :

button.Width = (double)new LengthConverter().ConvertFrom("2cm"); 

XAML 파서는 그것이 LengthConverter를 사용하는 것을 지정하는 TypeConverterAttribute을 가지고 볼 수 documentation page of the Width property에 필요한 값으로 문자열을 변환 할 TypeConverters를 사용합니다. 이 속성은 속성을 처리하는 방법을 로컬에서 재정의하는 데 사용할 수 있지만 클래스 수준에서도 적용 할 수 있으므로 Employee 클래스에 EmployeeConverter을 사용해야하는 것으로 지정하는이 속성이 있으면 변환기가 유형의 속성에 대한 기본값이됩니다. Employee.

나는 약간 사실에 당신이 잘 일반적인하기 위해 형식 변환기에서 IValueConverter을 구성하는 markup extension를 만들 수 있습니다,이 형식 변환기를 적용하지 않는 바인딩,하지만 충분히 간단 할 것 인 IValueConverter 내부에 그것을 사용 놀라게입니다.

+0

이것이 내가 찾고 있었던 것입니다. 고마워요! –

+0

도와 주셔서 감사합니다. :) –

2

) 및 2) DIP는이 장치 독립적이기 때문에, 당신이 할 수있는 문제가없는 "자연 단위"를 계산하십시오. 예외는 (부 자연스러운 :) 장치 종속 픽셀입니다.

문자열 값을 문자열에 원하는 단위를 지정할 수있는 double 값으로 변환하는 ValueConverter을 만듭니다. 그런 다음 Binding에서 ValueConverter를 사용하고 ViewModel에서 "자연 단위"로 계산할 수 있습니다.

3) 및 구현 : 나는 빠르게 봤지만 아무 것도 발견하지 못했지만 어쩌면 더 깊은 검색 결과를 보여줄 것입니다. 그렇지 않으면 자신의 변환기를 만드는 것이 그렇게 어렵지는 않습니다. 여기에 몇 가지 변환 정보를 정기적으로 : 당신이 문자열 주위에 지나가는 괜찮다면

96DIP == 1inch == 2.54cm; 
1cm == 37.8DIP; 
1zoll == 1inch == 2.54cm; 
+0

나는 tought 변환기 가야 할 수있는 방법입니다. 그러나 필자가 직접 작성하기 전에 XAML 파서가 사용하는 Converter를 결정하는 방법이 있다고 생각합니까? XAML이이 단위를 지원하기 때문에 이미 WPF에 기본 제공 변환기가 있어야한다고 생각합니다. 그래서 내장 된 것을 사용하여 preffer하고 싶습니다, 나는 그것이 어느 것인지를 결정하는 방법을 이해할 수 없습니다. 아마도 스택 추적 조사가 있을까요? 나는 정말로 모르겠다. 어떤 생각이야? :) –

+1

@ 애런 : 나는 또한 기존의 요소를 사용하고 싶지만 각 변환기마다 Google에 물어 보았다. 클래스 이름을 빨리 찾았다. 그러나이 특정한 경우에 구글은 말할 것도 없다. wpf에서 사용 된 변환기를 감지하기 위해, 나는 도울 수 없다. 나는 FCL을 더 깊게 파고 들지 못했다. 어쩌면 이것이 헌신적 인 질문 일 것입니다 : 특정 Conversion에 대해 WPF가 어떤 ValueConverter를 사용하는지 추적하는 방법은 무엇입니까? – HCL

+0

답변 해 주셔서 감사합니다. 필자는 올바른 변환기를 스스로 알아 내려고 실패 할 경우 새로운 질문을 던질 가능성이 있습니다. 다시 한 번 감사드립니다! –