我有一些内部 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>
为简洁起见,省略了路径元素的数据。
有什么想法吗?
答案 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.WriteAllText
和System.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中)