2012年11月8日木曜日

[C#][WPF][Silverlight]XAMLをロードしてプロパティ設定し、保存する


デザイナーさんに数百枚に及ぶの地図をXAMLで作成してもらい、埋め込まれている大量のカスタムコントロールのプロパティを設定することになった。デザイナーさんにプロパティ設定も一緒にお願いしたかったんだけど、それだけ工数がかかると費用もかかるっちゅうわけでなんとかならんか考えてみた。



ツールを作ろう。そう、京都に行こうみたいなのりだ。
XAML を読み込んで Excel とかで管理している情報からプロパティを埋め込んでに保存するやつ。


うーーーーん、ロードは XamlReader で読み込める。
でも Silverlight って XamlWriter なかったよなぁ。

よく考えてみると、XAML って要は XML じゃんという驚愕の新事実に気づく。
XML ファイルとしてロードして、プロパティ、つまり属性を追加して値を書き込めばいん
じゃねぇ?っていうことで、テストプロを作ってみた。


    string file = @"D:\hogehoge.xaml";
    string controlName = "hogehoge";
    string propertyName = "HogeProperty";
    string value = "ほげほげ";

    // カスタムコントロールの x:Name を検索するのに必要
    XNamespace x = "http://schemas.microsoft.com/winfx/2006/xaml";

    // ロード
    XElement root = XElement.Load(file);

    // 全要素検索
    foreach (var element in root.Descendants())
    {
        // 対象のコントロール名と一致したら、属性を設定(x:Nameっていう文字列にするとException!)
        if (element.Attribute(x + "Name") != null && element.Attribute(x + "Name").Value == controlName)
        {
            element.SetAttributeValue(propertyName, value);
            break;
        }
    }

    // XML宣言は無しでタブによるインデント
    var settings = new XmlWriterSettings();
    settings.OmitXmlDeclaration = true;
    settings.Indent = true;
    settings.IndentChars = "\t";

    // 保存
    using (var writer = XmlWriter.Create(file, settings))
    {
        root.Save(writer);
    }





おーけーおーけー、これで数百万円分の工数を稼げたな。
XML の操作なので Windowsアプリで作ればよくて、わざわざ Silverlight でブラウザ外
実行する云々考える必要もないしね。

0 件のコメント:

コメントを投稿