将属性提取到样式(Xml处理工具)

时间:2011-12-11 00:21:31

标签: wpf xaml styles

我需要将控件的道具(Height,Width,Horizo​​ntalAligment等等)提取到样式中。

你们知道有什么工具吗?

我已经尝试过Xaml Power工具(不错,但只能处理类似于属性属性的xml:无法识别) 还看了表达式混合..也没有找到任何东西。

至少有一些框架/ api可以轻松解析xaml(找到Xaml Toolkit,但它在2010年仍然保留在CTP版本中。)

谢谢!

1 个答案:

答案 0 :(得分:0)

如果您已经创建了一个元素和指定的属性,例如下面的Slider控件。

<Window x:Class="Styling.ExtractStyle"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="ViewTemplateSource" Height="300" Width="300">
    <Window.Resources>
    </Window.Resources>
    <Grid Name="g1">
        <Slider Name="mySlider" Height="100" VerticalAlignment="Center">
            <Slider.Width>200</Slider.Width>
        </Slider>        
    </Grid>
</Window> 

您可以实现FrameworkElement类的扩展...

public static class FrameworkElementExtensions
{
    public static void SaveElementStyleToFile(this FrameworkElement element, string fileName)
    {
        if (element != null)
        {
            XmlWriterSettings settings = new XmlWriterSettings
            {
                Indent = true,
                IndentChars = new string(' ', 4),
                NewLineOnAttributes = true
            };
            StringBuilder strbuild = new StringBuilder();
            XmlWriter xmlwrite = XmlWriter.Create(strbuild, settings);
            if (xmlwrite != null)
            {
                XamlWriter.Save(element, xmlwrite);
            }
            File.WriteAllText(fileName, strbuild.ToString());
        }
        else
        {
            throw new Exception("Cannot serialize a null object");
        }
    }
}

并调用扩展方法......

mySlider.SaveElementStyleToFile("mySliderStyle.xaml");

这将为您提供应用程序根目录中的XML文件,该文件捕获“硬编码”属性。这是它输出的内容......

<?xml version="1.0" encoding="utf-16"?>
<Slider
    Name="mySlider"
    Width="200"
    Height="100"
    VerticalAlignment="Center" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" />

然后,您可以使用编辑器将此文件转换为持久样式。请注意,目标Framework元素必须首先通过WPF的两遍布局系统运行才能使用此技术。

例如

TextBox t = new TextBox(); t.Height = 20; t.SaveElementStyleToFile( “myfile.xml中”);

由于这个原因,

NOT 会工作。除了Xaml Power Toys和/或完整的Xaml解析器提供的便利之外,这可能与您满足您的要求一样接近......