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");
이미 그 문제에 대처 한 : – bakala12