了解XAML语法

时间:2016-09-02 06:38:07

标签: c# wpf xaml

我有一个Theme属性,我可以像这样加载:

videoId

AeroTheme是一个班级。如何通过属性获得相同的结果?

 <xcad:DockingManager>
            <xcad:DockingManager.Theme>
                <xcad:AeroTheme>
                </xcad:AeroTheme>
            </xcad:DockingManager.Theme>

2 个答案:

答案 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属性。

当然使用这种方式并不简单。在您的示例中,为了使您可以满足以下条件:

  1. 课程AeroTheme应标有TypeConverterAttribute
  2. 属性中指定的类型是TypeConverter class。
  3. 的实例
  4. TypeConverter中,您有从字符串转换为AeroTheme对象的逻辑(通过TypeConverter的实现方法)。
  5. 代码示例:

    [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中声明它)的唯一方法是使用所描述的机制。

    另一种方法是声明一个对象并使用MarkupExtensionStaticResourceDynamicResource,各种类型的Binding等),如上所示。