2016-08-23 2 views
0

WPF로 재미있게 지내고 연결된 트리거 (System.Windows.Interactivity.dll과 유사)의 사용자 정의 구현을 사용하여 라이브러리를 작성하기로 결정했습니다.wpf 유형 변환의 리플렉션에서 DependencyProperty 설정

Trigger에 의해 호출 된 동작을 나타내는 클래스 TriggerAction이 있습니다. 사용자가 버튼을 클릭하는 동안 버튼의 배경을 설정하는 것과 같은 간단한 작업부터 시작하고 싶습니다.

예를 들어 EventTrigger 클래스와 같은 작업 코드를 이미 작성했지만 내 SetterTriggerAction에 하나의 문제점이 있습니다. 나는 Value 속성을 설정해야하는 속성의 이름을 나타내는 PropertyName이라는 두 가지 종속성 속성이 있습니다. Invoke 메서드에서 정의 된 값으로 속성을 설정하려고합니다. 여기

코드입니다 :

internal override void Invoke(DependencyObject obj) 
{ 
     if (obj == null) 
      return; 

     if (string.IsNullOrEmpty(PropertyName)) 
      return; 

     PropertyInfo property = obj.GetType().GetProperty(PropertyName, BindingFlags.Public | BindingFlags.Instance); 

     if (property == null) 
     { 
      Debug.WriteLine("Cannot find property {0} for type {1}.", PropertyName, obj.GetType()); 
      return; 
     } 

     MethodInfo setMethod = property.GetSetMethod(); 

     if (setMethod == null) 
     { 
      Debug.WriteLine("The property {0} does not have set method.", PropertyName); 
      return; 
     } 

     try 
     { 
      setMethod.Invoke(obj, new object[] { Value }); 
     } 
     catch(Exception ex) 
     { 
      Debug.WriteLine("Exception caught {0} with message {1}", ex.GetType(), ex.Message); 
     } 
} 

내 두 번째 시도 : 내가 쓴 XAML에서

internal override void Invoke(DependencyObject obj) 
{ 
     if (obj == null) 
      return; 
     if (string.IsNullOrEmpty(PropertyName)) return; 
     FieldInfo property = obj.GetType().GetField(PropertyName+"Property", BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy); 
     if (property == null) 
     { 
      Debug.WriteLine("Cannot find dependency property {0} for type {1}.", PropertyName+"Property", obj.GetType()); 
      return; 
     } 
     try 
     { 
      DependencyProperty dp = property.GetValue(obj) as DependencyProperty; 
      if(dp == null) 
      { 
       Debug.WriteLine("Cannot get DependencyProperty {0}", PropertyName + "Property"); 
       return; 
      } 
      obj.SetValue(dp, Value); 
     } 
     catch(Exception ex) 
     { 
      Debug.WriteLine("Exception caught {0} with message {1}", ex.GetType(), ex.Message); 
     } 
    } 

:

<Button HorizontalAlignment="Center" VerticalAlignment="Center" Content="Click"> 
     <i:Interaction.Triggers> 
      <i:EventTrigger EventName="Click"> 
       <i:SetterTriggerAction PropertyName="Background" Value="Red"/> 
      </i:EventTrigger> 
     </i:Interaction.Triggers> 
    </Button> 

를 그래서 나는 그것을하려는 버튼을 클릭 배경 빨간색입니다. 그러나 두 버전의 Invoke 메서드는 변환 문제로 인해서 출력 창에서 "빨강"이 속성 배경에 유효한 값이 아니라는 메시지를 받았습니다 (브러시가 아닌 문자열처럼 처리되기 때문에!). xaml (문자열 "빨강")에서 유효한 브러시 값으로 값을 변환 할 수있는 방법이 있습니까? 가능한 한 속성을 변환하는 일반적인 방법으로 갖고 싶습니다.

나는 xaml이 구문 분석되고 컨트롤의 속성이 설정 될 때 달성하고자하는 것과 비슷한 것을 수행한다고 생각합니다.

도움을 주시면 감사하겠습니다.

var redBrush = (Brush)new BrushConverter().ConvertFromString("Red"); 

답변

1

은 기본 형식 변환기 클래스 BrushConverter를 사용할 수있는 브러쉬로 문자열을 변환합니다. 해결 방법은 속성 형식을 가져 와서 TypeConverterAttribute로 표시되는지 여부를 확인하는 것입니다. 그런 다음 변환기의 인스턴스를 동적으로 만들고 ConvertFrom 메서드를 호출하십시오. `PresentationCore` 어셈블리에는 많은`TypeConverter` 클래스가 있습니다.
+0

이미 그 문제에 대처 한 : – bakala12