如何在运行时动态加载Silverlight 3中的内部xaml?

时间:2009-09-04 03:50:40

标签: xaml silverlight-3.0 canvas

我有一些内部 Canvas xaml文件,我想在运行时动态加载。例如,我想在页面中显示 Canvas 。但是,我似乎无法让它发挥作用。我尝试过使用 XamlReader Application.LoadComponent ,并使用 XDocument ;一切都无济于事。我似乎无法在线找到最佳实践。

Canvases 的存储方式如下:MyApp / Resources / Logos / Logo1.xaml。我不确定Logo1.xaml是否应该具有“组件”或“资源”的构建操作。在任何情况下,使用“MyApp; components / Resources / Logos / Logo1.xaml”的URI似乎都是正确的,但 Application.LoadComponent 在第0行位置0获得XamlParseException。

这是Logo1.xaml的一个伪示例:

<Canvas
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Width="286.233" Height="143.425">

    <Canvas>

        <Path />

        <Path />

        <Path />

        <Path />

    </Canvas>
</Canvas>

为简洁起见,省略了路径元素的数据。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

我使用构建操作“Resource”和带有ContentControl的XamlLoader工作:

var resourceName = string.Format("MyApp;component/Resources/Logos/{0}.xaml", logoName);
var uri = new Uri(resourceName, UriKind.Relative);
var streamResourceInfo = Application.GetResourceStream(uri);

string xaml = null;

using (var resourceStream = streamResourceInfo.Stream)
{
    using (var streamReader = new StreamReader(resourceStream))
    {
        xaml = streamReader.ReadToEnd();
    }
}

Canvas canvas = XamlReader.Load(xaml) as Canvas;

this.contentControl.Content = canvas;

答案 1 :(得分:2)

accepted answer对我来说并不直观,但可能适合某些人。

我对System.IO.File.WriteAllTextSystem.IO.File.ReadAllText感到更舒服。我从MSDN借了一段代码。对于测试,只需在运行时创建一个新的Canvas:

Canvas newCanvas = new Canvas()

然后,用File.WriteAllText写出来,也很简单,避免所有的URI内容,作为一个初学者我觉得很困惑。最后,请按上述方式阅读。完成。这证明您只需从文本文件中读取一些有效的画布代码,就可以动态加载。

private void Button2_Click(object sender, RoutedEventArgs e)
{
    Canvas newCanvas = new Canvas();
    newCanvas.Name = "newCanvas";
    string savedCanvas = XamlWriter.Save(newCanvas);
    File.WriteAllText("savedCanvas.txt", savedCanvas);
    savedCanvas = File.ReadAllText("savedCanvas.txt");
    // Load the canvas
    StringReader stringReader2 = new StringReader(savedCanvas);
    XmlReader xmlReader2 = XmlReader.Create(stringReader2);
    Canvas newCreatedCanvas = (Canvas)XamlReader.Load(xmlReader2);
    this.Content = newCreatedCanvas;
}

这些想法是from MSDN,如下所示:

  

XamlReader.Load方法(XmlReader)

     

.NET Framework 4

     

读取指定XmlReader中的XAML输入,并返回一个对象,该对象是相应对象树的根。

     

命名空间: System.Windows.Markup

     

汇编: PresentationFramework(在PresentationFramework.dll中)