我正在尝试构建一个动态加载帆布元素的WPF用户控件。存储在数据库中的是我想在viewbox中调用的XAML画布图的模板。
执行xamlreader.load方法时,我遇到了麻烦,其中抛出异常说,说父元素(" canvas")是未知类型。我已经做了一些研究,建议在Xamlxmlreadersettings对象中定义本地隔离,然后将其传递到读者中。
我的代码如下:
usercontrol1.xaml.cs:
StringReader stringReader = new StringReader(cart.svgtemplate); //this a string retrieved from DB that has the XAML
XmlReaderSettings settings = new XmlReaderSettings { NameTable = new NameTable() };
XmlNamespaceManager xmlns = new XmlNamespaceManager(settings.NameTable);
xmlns.AddNamespace("x", "http://schemas.microsoft.com/winfx/2006/xaml");
XmlParserContext context = new XmlParserContext(null, xmlns, "", XmlSpace.Default);
XmlReader xmlReader = XmlReader.Create(stringReader,settings, context);
var xamlXmlReaderSettings = new XamlXmlReaderSettings()
{
LocalAssembly = System.Reflection.Assembly.GetExecutingAssembly()
};
XamlXmlReader xamlXmlReader = new XamlXmlReader(xmlReader, xamlXmlReaderSettings);
this.viewbox.Child = (UIElement)System.Windows.Markup.XamlReader.Load(xamlXmlReader);
XAML来自DB
<Canvas x:Name="canvas" Width="100" Height="90" RenderTransformOrigin="0.5,0.5" Background="{DynamicResource {x:Static SystemColors.ControlLightBrushKey}}">
<Rectangle Canvas.Left="1" Canvas.Top="1" Width="95" Height="80" Name="rect442" Fill="#ffff00"/>
<Rectangle Canvas.Left="1" Canvas.Top="1" Width="1.75" Height="80" Name="rect446" Fill="#0000ff"/>
<Rectangle Canvas.Left="2.75" Canvas.Top="79.25" Width="92.5" Height="1.75" Name="rect450" Fill="#0000ff"/>
<Rectangle Canvas.Left="94.25" Canvas.Top="1" Width="1.75" Height="80" Name="rect454" Fill="#0000ff"/>
<Rectangle Canvas.Left="2.75" Canvas.Top="42.5" Width="72" Height="1.75" Name="rect458" Fill="#0000ff"/>
<Rectangle Canvas.Left="74.75" Canvas.Top="1" Width="1.75" Height="78.25" Name="rect462" Fill="#0000ff"/>
....
usercontrol1.xaml:
<UserControl x:Name="userControl" x:Class="Smart_Cart_Sample.UserControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:Smart_Cart_Sample"
mc:Ignorable="d"
d:DesignHeight="700" d:DesignWidth="800">
<Viewbox x:Name="viewbox" Stretch="Fill" Width="{Binding Width, ElementName=userControl}" Height="{Binding Height, ElementName=userControl}" RenderTransformOrigin="0.5,0.5">
</Viewbox>
</UserControl>
我不确定如何转介执行组件是正确的方法。我希望阅读XAML以使用呼叫控件的本地组件。我感谢我能获得的所有见解。
缺少默认名称空间:
var settings = new XmlReaderSettings { NameTable = new NameTable() };
var xmlns = new XmlNamespaceManager(settings.NameTable);
// here
xmlns.AddNamespace("", "http://schemas.microsoft.com/winfx/2006/xaml/presentation");
xmlns.AddNamespace("x", "http://schemas.microsoft.com/winfx/2006/xaml");
var context = new XmlParserContext(null, xmlns, "", XmlSpace.Default);
var xmlReader = XmlReader.Create(stringReader, settings, context);
viewbox.Child = (UIElement)System.Windows.Markup.XamlReader.Load(xmlReader);