none
XAMLをXML的に処理する方法について RRS feed

  • 質問

  • 初めまして,宜しくお願いします.

    XAMLをXMl的に処理する方法についてお聞きしたいです.
    例えば以下のXAMLファイルを読み込んだ場合に,
    Canvasタグを取得して,そのName属性値などを取得し,その値をテキストブロックに
    表示するプログラムを作成したいと考えております.

    その時にできればプログラム側で,XMLを用いてタグを検索し,その属性値を表示するような
    プログラムを作りたいと考えいるのですが,色々と調べてはみたのですが,どうものっていなく困っております.

    最終的には,そのCanvasの属性値とテキストボックス側でデータバインディングして,
    動的に挙動を変化(例えば,表示するとかしないとか,背景の色を設定するとか・・・)させたいと考えております.


    知っている方がいたら,お力添えをお願いします.

    <Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        x:Class="Window1"
        x:Name="Window"
        Title="Window1"
        Width="640" Height="480">

        <Grid x:Name="LayoutRoot">
            <Canvas Margin="79,59,306,98" x:Name="Canvas1">
                <Canvas x:Name="Canvas2" Width="174" Height="94" Canvas.Left="29" Canvas.Top="22"/>
                <Canvas x:Name="Canvas3" Width="172" Height="107" Canvas.Left="31" Canvas.Top="160"/>
            </Canvas>
            <Canvas HorizontalAlignment="Right" Margin="0,59,62,98" x:Name="Canvas6" Width="209">
                <Rectangle Fill="#FFFFFFFF" Stroke="#FF000000" Width="144" Height="47" Canvas.Left="38" Canvas.Top="30"/>
                <Canvas Width="143" Height="135" Canvas.Left="39" Canvas.Top="114"/>
            </Canvas>
        </Grid>
    </Window>


    大変お手数をお掛けしますが,どうぞ宜しくお願いします.
    2008年8月30日 8:24

回答

  • System.Windows.Markup.XamlReader クラスというのがありますが、これでやりたいことは満たせますか?

    2008年8月30日 9:03
  • strってStringReaderですよね?XAML_String変数に値が入っててstrに値が入らないということは考えられないのですが…

    どうでしょう?

     

    個人的に問題があるように見えるのは、最後の行の

    Canvas1 = XamlReader.Load(XML_XML)

    だと思います。

     

    これだとCanvas1という変数にXamlReaderで読み込んだものを代入してるだけです。表示には一切変更を与えません。
    Canvas1.Children.Add((Control)XamlReader.Load(XAML_XML));

    とかにするとどうですか?

    何かしら表示されるようにはなると思うのですが。

     

    簡単なサンプルを作ってみました。参考にしてください。

    http://cid-c0989b857f2f850c.skydrive.live.com/self.aspx/%e5%85%ac%e9%96%8b/samples/WpfXamlReaderTest.zip
    2008年8月31日 3:06
  •  たが さんからの引用
    サンプルプログラムまでつくっていただき有り難うございます.

    サンプルプログラムで(Control)XamlReader.Parse(XAML);ここなのですが,
    Parseってのは何を意味しているのですか? ここが引っかかってしまい,実行することができませんでした.
    Loadってことになるのでしょうか?

    MSDNライブラリに詳細はあるので参照してください。

    文字列を受け取るLoadメソッドといった感じの動きをします。


     たが さんからの引用
    はい,そうなんですよね.私も入らないのはおかしいとおもってるんですが・・・.
            XAML_Stringの中にはちょっと省きましたが以下のタグが入っているのですが
       "<Canvas Name="UIgamen" Width="640" Height="480" Visibility="Visible" Canvas.Left="0" Canvas.Top="0" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"></Canvas>"

    strの中には{System.IO.StringReader}でNullしかはいらないです.

    ん~。どうやって確認しました?


     たが さんからの引用

    なるほど変数を代入しているから表示に変更を与えないということなんのですね.

    参照について勉強してみてください。

    多分入門書あたりには、そこそこのページをさいて解説があると思います。

     

     たが さんからの引用

    ちなみに,このChildren.Addの場合なのですが,Canvasの中にXAMLを加えていくということになるかと思いますが,
    変更するといった場合には,一度削除して,加えるというプロセスを踏まないといけないことでしょうか?

    単純にやるならそうなります。

    TextBoxの変更を監視して、こういう変更だから、ここにテキストボックス入れたらいい!とかいう判断のロジックを自分で書けば、もっと効率的に出来なくも無いと思います。

    本格的にやるとしたら、ちょっと大変な気がします。

     

    前のサンプルよりも、もうちょいしっかりしたものを作ってみました。参考にしてください。

    http://cid-c0989b857f2f850c.skydrive.live.com/self.aspx/%e5%85%ac%e9%96%8b/samples/WpfXamlPreview.zip

    2008年9月1日 9:05

すべての返信

  • System.Windows.Markup.XamlReader クラスというのがありますが、これでやりたいことは満たせますか?

    2008年8月30日 9:03
  • 返信ありがとうございます.
    たがです.

    はい,私もそう思って実装してみたのですが,うまくいきませんでした.
    現在のXAMLファイルをXAMLWriterで書き出してやり,そのテキストの値を
    テキストボックスでCanvasの大きさを変更してXAMLReaderで読ませてやればいいのかな?
    って思ったのですが,strの時点で値が入っていなく今困っております.

     Dim XAML_String As String = XAML_Text.Text
     Dim str As New StringReader(XAML_String)
     Dim XAML_XML As XmlReader = XmlReader.Create(str)
     Canvas1 = XamlReader.Load(XML_XML)

    また,もしうまくいった場合に,UpdateWindowみたいな関数で
    書き換えてあげないといけないと思うのですが,探してみてもいい関数が見つかりません.

    これについてもお手数をおかけしますが,お願いします.

    どうぞよろしくお願いします.

    2008年8月30日 17:28
  • strってStringReaderですよね?XAML_String変数に値が入っててstrに値が入らないということは考えられないのですが…

    どうでしょう?

     

    個人的に問題があるように見えるのは、最後の行の

    Canvas1 = XamlReader.Load(XML_XML)

    だと思います。

     

    これだとCanvas1という変数にXamlReaderで読み込んだものを代入してるだけです。表示には一切変更を与えません。
    Canvas1.Children.Add((Control)XamlReader.Load(XAML_XML));

    とかにするとどうですか?

    何かしら表示されるようにはなると思うのですが。

     

    簡単なサンプルを作ってみました。参考にしてください。

    http://cid-c0989b857f2f850c.skydrive.live.com/self.aspx/%e5%85%ac%e9%96%8b/samples/WpfXamlReaderTest.zip
    2008年8月31日 3:06
  • サンプルプログラムまでつくっていただき有り難うございます.

    サンプルプログラムで(Control)XamlReader.Parse(XAML);ここなのですが,
    Parseってのは何を意味しているのですか? ここが引っかかってしまい,実行することができませんでした.
    Loadってことになるのでしょうか?

    はい,そうなんですよね.私も入らないのはおかしいとおもってるんですが・・・.
            XAML_Stringの中にはちょっと省きましたが以下のタグが入っているのですが
       "<Canvas Name="UIgamen" Width="640" Height="480" Visibility="Visible" Canvas.Left="0" Canvas.Top="0" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"></Canvas>"

    strの中には{System.IO.StringReader}でNullしかはいらないです.


    なるほど変数を代入しているから表示に変更を与えないということなんのですね.
    表示に影響させる為の関数みたいなのは提供されていないですか?

    Canvas1.Children.Add((Control)XamlReader.Load(XAML_XML));
    こういう風にすると表示されるということですね! なるほど!!試してみます.
    でもその前にstringReaderに何も入らないのを直さないとですね.

    ちなみに,このChildren.Addの場合なのですが,Canvasの中にXAMLを加えていくということになるかと思いますが,
    変更するといった場合には,一度削除して,加えるというプロセスを踏まないといけないことでしょうか?

    お手数をお掛けしますが,どうぞ宜しくお願いします.

    2008年8月31日 17:27
  •  たが さんからの引用
    サンプルプログラムまでつくっていただき有り難うございます.

    サンプルプログラムで(Control)XamlReader.Parse(XAML);ここなのですが,
    Parseってのは何を意味しているのですか? ここが引っかかってしまい,実行することができませんでした.
    Loadってことになるのでしょうか?

    MSDNライブラリに詳細はあるので参照してください。

    文字列を受け取るLoadメソッドといった感じの動きをします。


     たが さんからの引用
    はい,そうなんですよね.私も入らないのはおかしいとおもってるんですが・・・.
            XAML_Stringの中にはちょっと省きましたが以下のタグが入っているのですが
       "<Canvas Name="UIgamen" Width="640" Height="480" Visibility="Visible" Canvas.Left="0" Canvas.Top="0" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"></Canvas>"

    strの中には{System.IO.StringReader}でNullしかはいらないです.

    ん~。どうやって確認しました?


     たが さんからの引用

    なるほど変数を代入しているから表示に変更を与えないということなんのですね.

    参照について勉強してみてください。

    多分入門書あたりには、そこそこのページをさいて解説があると思います。

     

     たが さんからの引用

    ちなみに,このChildren.Addの場合なのですが,Canvasの中にXAMLを加えていくということになるかと思いますが,
    変更するといった場合には,一度削除して,加えるというプロセスを踏まないといけないことでしょうか?

    単純にやるならそうなります。

    TextBoxの変更を監視して、こういう変更だから、ここにテキストボックス入れたらいい!とかいう判断のロジックを自分で書けば、もっと効率的に出来なくも無いと思います。

    本格的にやるとしたら、ちょっと大変な気がします。

     

    前のサンプルよりも、もうちょいしっかりしたものを作ってみました。参考にしてください。

    http://cid-c0989b857f2f850c.skydrive.live.com/self.aspx/%e5%85%ac%e9%96%8b/samples/WpfXamlPreview.zip

    2008年9月1日 9:05
  • こんにちは。中川俊輔 です。

     

    囚人さん、かずきさん、回答ありがとうございます。

     

    たがさん、フォーラムのご利用ありがとうございます。

    その後いかがでしょうか?

    有用な情報と思われたため、囚人さん、かずきさんの回答へ回答済みチェックをつけさせていただきました。

    追加の質問等ありましたら、是非投稿してみてください!

     

    回答済みチェックが付くことにより、有用な情報を探している方が情報を見つけやすくなります。
    有用な情報と思われる回答があった場合は、なるべく回答済みボタンを押してチェックを付けてください。

    たがさんはチェックを解除することもできますので、ご確認ください。

     

    それでは!

    2008年9月12日 5:05
  • かずきさん


    出張やらで慌ただしく,ネットを確認できず
    大変遅くなってしまい誠に申し訳ございません.


    なるほどとっても参考になります.
    今からちょっと作っていただいたサンプルを元に変更して,いろいろといじってみたいと思います.

    特にTextBoxの変更の監視というところがとても自分では重要なことのように感じますので,
    そこらへんを重点的に調べなおしたいと思います.

    本当に有り難うございました.
    そして,本当に折角書いていただいたのに返事が遅くなってしまい,申し訳ございません.
    2008年10月16日 8:15