我有一个Theme属性,我可以像这样加载:
videoId
AeroTheme是一个班级。如何通过属性获得相同的结果?
<xcad:DockingManager>
<xcad:DockingManager.Theme>
<xcad:AeroTheme>
</xcad:AeroTheme>
</xcad:DockingManager.Theme>
答案 0 :(得分:3)
您需要该主题的实例,您可以将其作为静态资源提供。例如,如果父控件是网格:
<Grid.Resources>
<xcad:AeroTheme x:Key="myTheme"/>
</Grid.Resources>
<xcad:DockingManager Theme="{StaticResource myTheme}">
答案 1 :(得分:0)
通常,在xaml中通过属性设置复杂类型(例如类)的属性是不可能的,而不在Xaml explicitelly中声明此对象。解析XAML时,正在构造实际的对象树。 Xaml使您可以比常见的XML更加扩展地使用属性。特别是,你可以这样写:
<Grid Backgroud="Red"/>
在编译时,Red只不过是字符串值。然而,WPF在场景背后扮演着神奇的角色。神奇的是,WPF通过反射读取属性类型(在此示例中,Background属性类型为Brush
),它在TypeConverterAttribute
类上找到Brush
(再次通过反射)并使用从TypeConverter
开始的适当类来从字符串转换。在此示例中,WPF将使用BrushConverter
类(位于PresentationCore
中)并调用ConvertFrom方法来获取实际Brush
对象以设置Background
属性。
当然使用这种方式并不简单。在您的示例中,为了使您可以满足以下条件:
AeroTheme
应标有TypeConverterAttribute
TypeConverter
class。TypeConverter
中,您有从字符串转换为AeroTheme
对象的逻辑(通过TypeConverter
的实现方法)。代码示例:
[TypeConverter(typeof(AeroThemeConverter)]
public class AeroTheme
{
...
}
public class AeroThemeConverter : TypeConverter
{
//implementation of convertion here
}
这样,如果你有XAML:
<xcad:DockingManager Theme="Aero">
WPF使用AeroThemeConverter
中编写的转换来完成魔术并设置您的Theme属性。
这当然是更完整,也不是工作的例子,但它显示了这个想法。要获取有关此内容的更多信息,请参阅MSDN文档:
https://msdn.microsoft.com/en-us/library/system.componentmodel.typeconverter(v=vs.110).aspx
因此,通过属性设置属性(不在XAML中声明它)的唯一方法是使用所描述的机制。
另一种方法是声明一个对象并使用MarkupExtension
(StaticResource
,DynamicResource
,各种类型的Binding
等),如上所示。