2012年12月3日月曜日

外部のXamlファイルを読み込んで表示

XamlXmlReader で 指定したXamlファイルを読み込んで、XamlObjectWriter で オブジェクトにしたあと、Grid の Children に追加しています。
XamlObjectWriter.Result で生成したオブジェクトを取得できます。
サンプルでは、テキストと円を表示する Canvas.xaml ファイルを開いてます。XamlObjectWriter.Result は、Canvasオブジェクトになります。




Canvas.xaml

<Canvas xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <TextBlock>これは読み込んだXamlです。</TextBlock>
    <Ellipse Canvas.Top="50" Canvas.Left="50" Width="100" Height="100" Stroke="Black" />
</Canvas>

MainWindow.xaml

<Window x:Class="XamlTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="XamlTest" Height="300" Width="300">
    <Window.CommandBindings>
        <CommandBinding Command="Open" Executed="OpenCommandHandler"/>
    </Window.CommandBindings>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <Menu Grid.Row="0">
            <MenuItem Command="Open" />
        </Menu>
        <Grid Grid.Row="1" Name="pageGrid" />
    </Grid>
</Window>

MainWindow.xaml.cs

using Microsoft.Win32;
using System.Windows;
using System.Windows.Input;
using System.Xaml;

namespace XamlTest
{
    public partial class MainWindow Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void OpenCommandHandler(object sender, ExecutedRoutedEventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            if (ofd.ShowDialog() == true)
            {
                XamlXmlReader xxr = new XamlXmlReader(ofd.FileName);
                XamlObjectWriter xow = new XamlObjectWriter(xxr.SchemaContext);
                while (xxr.Read())
                {
                    xow.WriteNode(xxr);
                }
                this.pageGrid.Children.Add((UIElement)xow.Result);
            }
        }
    }
}

0 件のコメント:

コメントを投稿