从 wpf 中的反射设置依赖属性 - 类型转换
Set DependencyProperty from reflection in wpf - type convertion
我对 WPF 很感兴趣,因此我决定构建一个带有附加触发器自定义实现的库(类似于 System.Windows.Interactivity.dll),但是我自己的。
我有一个 class TriggerAction
代表触发器调用的动作。我想从一些非常简单的事情开始,比如在用户单击按钮时设置按钮的背景。
我已经编写了一些工作代码,例如 EventTrigger class,但我的 SetterTriggerAction
有一个问题。我有两个依赖属性 PropertyName
,代表 属性 的名称,应将其设置为 Value
属性。在 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);
}
}
我的第二次尝试:
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);
}
}
在xaml中我写道:
<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 方法的两个版本都存在转换问题,在我的输出 window 中,我收到一条消息,指出 "Red" 不是 属性 背景的有效值(因为它被视为字符串而不是 Brush !)。
有什么方法可以将值从 xaml(字符串 "Red")转换为有效的 Brush 值?我希望尽可能通用地转换属性。
我认为在解析 xaml 并设置控件属性时完成了与我想要实现的类似的事情。
如有任何帮助,我们将不胜感激。
要将字符串转换为 Brush,您可以使用默认类型转换器 class BrushConverter
:
var redBrush = (Brush)new BrushConverter().ConvertFromString("Red");
我对 WPF 很感兴趣,因此我决定构建一个带有附加触发器自定义实现的库(类似于 System.Windows.Interactivity.dll),但是我自己的。
我有一个 class TriggerAction
代表触发器调用的动作。我想从一些非常简单的事情开始,比如在用户单击按钮时设置按钮的背景。
我已经编写了一些工作代码,例如 EventTrigger class,但我的 SetterTriggerAction
有一个问题。我有两个依赖属性 PropertyName
,代表 属性 的名称,应将其设置为 Value
属性。在 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);
}
}
我的第二次尝试:
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);
}
}
在xaml中我写道:
<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 方法的两个版本都存在转换问题,在我的输出 window 中,我收到一条消息,指出 "Red" 不是 属性 背景的有效值(因为它被视为字符串而不是 Brush !)。 有什么方法可以将值从 xaml(字符串 "Red")转换为有效的 Brush 值?我希望尽可能通用地转换属性。
我认为在解析 xaml 并设置控件属性时完成了与我想要实现的类似的事情。
如有任何帮助,我们将不胜感激。
要将字符串转换为 Brush,您可以使用默认类型转换器 class BrushConverter
:
var redBrush = (Brush)new BrushConverter().ConvertFromString("Red");