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

如何在运行时在Silverlight 3中动态加载内部xaml?,xaml,silverlight-3.0,canvas,Xaml,Silverlight 3.0,Canvas,我有一些内部画布xaml文件,我希望在运行时动态加载这些文件。例如,我想在页面中显示画布。然而,我似乎无法让它发挥作用。我尝试过使用XamlReader、Application.LoadComponent和XDocument;都没有用。我似乎也找不到这方面的最佳实践 画布的存储方式如下:MyApp/Resources/Logos/Logo1.xaml。我不确定Logo1.xaml是否应该具有“Component”或“Resource”的构建操作。在任何情况下,使用“MyApp;component

我有一些内部画布xaml文件,我希望在运行时动态加载这些文件。例如,我想在页面中显示画布。然而,我似乎无法让它发挥作用。我尝试过使用XamlReader、Application.LoadComponent和XDocument;都没有用。我似乎也找不到这方面的最佳实践

画布的存储方式如下:MyApp/Resources/Logos/Logo1.xaml。我不确定Logo1.xaml是否应该具有“Component”或“Resource”的构建操作。在任何情况下,使用“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>

为了简洁起见,省略了path元素的数据


有什么想法吗?

我使用构建操作“资源”和带有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;

我使用构建操作“资源”和带有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;
这不是我的直觉,但可能适合一些人

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

Canvas newCanvas = new Canvas()
然后,用
File.writealText
把它写出来,也很简单,避免了所有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;
}
这些想法如下:

加载方法(XmlReader)

.NET框架4

读取指定对象中的XAML输入,并返回相应对象树的根对象

名称空间:

程序集:PresentationFramework(在PresentationFramework.dll中)

这不是我的直觉,但可能适合一些人

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

Canvas newCanvas = new Canvas()
然后,用
File.writealText
把它写出来,也很简单,避免了所有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;
}
这些想法如下:

加载方法(XmlReader)

.NET框架4

读取指定对象中的XAML输入,并返回相应对象树的根对象

名称空间:

程序集:PresentationFramework(在PresentationFramework.dll中)


通常的方法是使用
XamlReader
。你犯了什么错误?在我的Silverlight书中有一整章都是关于这个的,不幸的是现在在家里。今晚(大约四个小时后),我可以给你提供你想要的任何信息。我不知道答案,但这个示例正在这样做,也许会有所帮助。正常的方法是使用
XamlReader
。你犯了什么错误?在我的Silverlight书中有一整章都是关于这个的,不幸的是现在在家里。今晚(大约四个小时后),我可以给你你想要的任何信息。我不知道答案,但这个示例正在这样做,也许这会有所帮助。