我已经设法将其简化为一个简单的测试用例.在使用以下方法解析此XAML期间抛出异常XamlReader.Parse():
<DockPanel xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<DockPanel.Resources>
<Style TargetType="TextBox">
<Style.Triggers>
<Trigger Property="IsReadOnly" Value="True">
<Setter Property="Background" Value="#FFEEEEEE" />
</Trigger>
</Style.Triggers>
</Style>
</DockPanel.Resources>
<TextBox IsReadOnly="True" />
</DockPanel>
Run Code Online (Sandbox Code Playgroud)
异常消息是:
无法设置未知成员'System.Windows.Controls.TextBox.IsReadOnly'.行号'13'和行位置'11'.
如果我不设置IsReadOnly上TextBox,它解析罚款.如果我删除样式触发器,它也会解析.
任何人都可以对此有所了解吗?我对WPF很新.
更新:
这是我用来重现这个的单元测试(它在我的电脑上失败了):
[TestMethod]
public void TestIsReadOnlyOnTextBox()
{
// Arrange
var xaml =
@"<DockPanel xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"" xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml"">
<DockPanel.Resources>
<Style TargetType=""TextBox"">
<Style.Triggers>
<Trigger Property=""IsReadOnly"" Value=""True"">
<Setter Property=""Background"" Value=""#FFEEEEEE"" />
</Trigger>
</Style.Triggers>
</Style>
</DockPanel.Resources>
<TextBox IsReadOnly=""True"" />
</DockPanel>
";
// Act
try {
var root = XamlReader.Parse(xaml);
}
catch (XamlParseException ex) …Run Code Online (Sandbox Code Playgroud) 我想加载存储为XAML文件的矢量图形(单独的文件,不在字典中),嵌入我的应用程序中,我有几个问题要做:
XAML看起来有点模棱两可,因为它可以用来表示像矢量图像这样的静态资源,或者像WPF中那样动态构建的接口.因此,我不清楚XAML矢量图像的格式:根元素应该是什么,比如svg矢量图像的"svg"标签?目前,我使用Canvas作为顶级元素,因为我想在另一个Canvas中绘制我的图形.
以编程方式加载这些文件的最佳方法是什么(我的意思是,从xaml文件创建Canvas)?我已经看过(并尝试过)使用XamlReader的不同解决方案,但没有任何效果:应用程序崩溃,调试器没有帮助(我遇到的大多数问题似乎在解析期间发生,并且错误消息不清楚).
我已经阅读http://learnwpf.com/post/2006/06/04/How-do-I-Include-Vector-Based-Image-Resources-in-my-WPF-Application.aspx,但链接到处理资源文件加载的文章已经死亡,图像不是使用C#代码创建的.
WPF应用程序具有使用以下XamlReader.Load()方法从单独文件加载用户控件的操作:
StreamReader mysr = new StreamReader(pathToFile);
DependencyObject rootObject = XamlReader.Load(mysr.BaseStream) as DependencyObject;
ContentControl displayPage = FindName("displayContentControl") as ContentControl;
displayPage.Content = rootObject;
Run Code Online (Sandbox Code Playgroud)
由于文件的大小,该过程需要一些时间,因此UI会冻结几秒钟.
为了保持应用程序响应,我尝试使用后台线程来执行在UI更新中不直接调用的操作部分.
当BackgroundWorker我尝试使用时出现错误:调用线程必须是STA,因为许多UI组件都需要这个
所以,我走另一条路:
private Thread _backgroundThread;
_backgroundThread = new Thread(DoReadFile);
_backgroundThread.SetApartmentState(ApartmentState.STA);
_backgroundThread.Start();
void DoReadFile()
{
StreamReader mysr3 = new StreamReader(path2);
Dispatcher.BeginInvoke(
DispatcherPriority.Normal,
(Action<StreamReader>)FinishedReading,
mysr3);
}
void FinishedReading(StreamReader stream)
{
DependencyObject rootObject = XamlReader.Load(stream.BaseStream) as DependencyObject;
ContentControl displayPage = FindName("displayContentControl") as ContentControl;
displayPage.Content = rootObject;
}
Run Code Online (Sandbox Code Playgroud)
这解决了什么,因为所有耗时的操作都保留在UI线程中.
当我尝试这样做时,在后台进行所有解析:
private Thread _backgroundThread;
_backgroundThread = new …Run Code Online (Sandbox Code Playgroud) 所述XamlReader加载的Xaml使用而没有任何问题的本地组件和WPF组件内定义的类型.
如果我包含在外部程序集中定义的类型,则抛出带有以下消息的XamlParseException.
无法创建未知类型'{clr-namespace:Telerik.Windows.Controls; assembly = Telerik.Windows.Controls.Charting} SeriesMapping'.' 行号'13'和行位置'18'.
是否可以使用此技术从外部组件加载类型?
我正在尝试使用在代码后面动态创建的(对于 WPF 数据网格)XamlReader.Load()进行解析:DataTemplate
DataTemplate dataTemplate;
StringReader template = new StringReader($@"
<DataTemplate
xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""
xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml""
xmlns:local=""clr-namespace:MyApp;assembly=MyApp"">
<DataTemplate.Resources>
<local:ArrayMultiValueConverter x:Key=""arrayMultiValueConverter""/>
</DataTemplate.Resources>
<StackPanel Orientation=""Vertical"">
<Expander VerticalAlignment=""Center"" xmlns:i=""http://schemas.microsoft.com/xaml/behaviors"">
<i:Interaction.Triggers>
<i:EventTrigger EventName=""IsExpanded"">
<i:InvokeCommandAction Command=""{{Binding DataContext.TextFilterColumn}}""/>
</i:EventTrigger>
</i:Interaction.Triggers>
<Expander.Header>
<TextBlock x:Name=""{dtColumnName}"" VerticalAlignment=""Center"" Text=""{{TemplateBinding Content}}"" Margin=""5,5,5,0"" FontWeight=""SemiBold""/>
</Expander.Header>
<StackPanel Orientation=""Horizontal"">
<TextBox x:Name=""{"TbxFilter" + dtColumnName}"" Width=""100"" Margin=""5""/>
<TextBlock Margin=""0,0,5,0"" VerticalAlignment=""Center"" FontFamily=""Segoe MDL2 Assets"">
<Hyperlink TextDecorations=""{{x:Null}}"" Command=""{{Binding DataContext.FilterColumnName, RelativeSource={{RelativeSource FindAncestor, AncestorType={{x:Type Window}}}}}}"">
<Hyperlink.CommandParameter>
<MultiBinding Converter=""{{StaticResource arrayMultiValueConverter}}"">
<Binding Path=""Text"" ElementName=""{dtColumnName}"" />
<Binding Path=""Text"" ElementName=""{"TbxFilter" + dtColumnName}"" />
</MultiBinding> …Run Code Online (Sandbox Code Playgroud) 我有一个类,包含Brush MyBrush标记为的属性[XmlIgnore].然而,它在流中被序列化,在尝试读取时会导致麻烦XamlReader.
我做了一些测试,例如当改变Property的可见性(到内部)时,它在流中消失了.不幸的是,我不能在我的特定场景中这样做.
备注:据我所知,C#4.0
这是我的单元测试中的一个方法,我在那里测试XamlSerialization:
// buffer to a StringBuilder
StringBuilder sb = new StringBuilder();
XmlWriter writer = XmlWriter.Create(sb, settings);
XamlDesignerSerializationManager manager = new XamlDesignerSerializationManager(writer) {XamlWriterMode = XamlWriterMode.Expression};
XamlWriter.Save(testObject, manager);
xml = sb.ToString();
Assert.IsTrue(!String.IsNullOrEmpty(xml) && !String.IsNullOrEmpty(xml), "Xaml Serialization failed for " + testObject.GetType() + " no xml string available");
xml = sb.ToString();
MemoryStream ms = xml.StringToStream();
object root = XamlReader.Load(ms);
Assert.IsTrue(root != null, "After reading from MemoryStream no result for …Run Code Online (Sandbox Code Playgroud) 我正在XamlReader成功使用加载xaml文件并创建一个FrameworkElement可以使用的文件.
我正在加载的xaml中包含绑定表达式,例如:
<TextBlock Text="{Binding DataContextTextProperty}" />
Run Code Online (Sandbox Code Playgroud)
如果我将FrameworkElement放回到XamlReader.Load()WPF窗口,那么绑定一切正常.
但是,在这种情况下,我正在使用Laurent Bugnion关于从WPF/XAML创建PNG的优秀文章.由于结果XamlReader.Load()是通过a直接写入PNG VisualBrush,因此似乎绕过了WPF调用绑定表达式的必要机制.
这让我相信实际的绑定并不是真的只是通过调用来调用XamlReader.Load(),或者它们因为我不知道的事情而不能正常工作,直到你添加FrameworkElement到一个可视树.现有的视觉树或其他东西.
我可以做些什么来确保调用这些绑定吗?
提前谢谢了.
我试图在我的资源字典中获取特定模板.这是我的资源字典
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:view="clr-namespace:Test.Layout.View"
xmlns:toolkit="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Toolkit"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"><DataTemplate x:Key="LeftRightLayout">
<toolkit:DockPanel>
<view:SharedContainerView toolkit:DockPanel.Dock="Left"/>
<view:SingleContainerView toolkit:DockPanel.Dock="Right"/>
</toolkit:DockPanel>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)
但是当它到达XamlReader.Load时
private static ResourceDictionary GetResource(string resourceName)
{
ResourceDictionary resource = null;
XDocument xDoc = XDocument.Load(resourceName);
resource = (ResourceDictionary)XamlReader.Load(xDoc.ToString(SaveOptions.None));
return resource;
}
Run Code Online (Sandbox Code Playgroud)
找不到"SharedContainerView"类型,因为"clr-namespace:Test.Layout.View"是一个未知的命名空间.[线:4位置:56]
xaml datatemplate resourcedictionary xamlreader silverlight-4.0
我正在尝试在我的WPF项目中实现下面的代码,以便为具有动态列的DataGrid动态生成DataTemplates.我在这里找到了StackOverflow上的代码
public DataTemplate Create(Type type)
{
return (DataTemplate)XamlReader.Load(
@"<DataTemplate
xmlns=""http://schemas.microsoft.com/client/2007"">
<" + type.Name + @" Text=""{Binding " + ShowColumn + @"}""/>
</DataTemplate>"
);
}
Run Code Online (Sandbox Code Playgroud)
但是,在XamlReader.Load代码上,我收到错误"无法从'string'转换为'System.Xaml.XamlReader'.
我试图通过将代码更改为:
return (DataTemplate)XamlReader.Load(XmlReader.Create(
Run Code Online (Sandbox Code Playgroud)
但是我在字符串中传递无效字符时遇到错误.
另外,我不确定如何将TextBlock传递给此代码.我想我会创建一个TextBlock并将其作为Type参数传递,但我得到错误"无法从'System.Windows.Controls.TextBlock'转换为'System.Type'
任何帮助赞赏.
我正在构建一个通用的 WP7 程序集,它将显示我的应用程序的通用帮助/有关信息,每个应用程序程序集将指定一对 StackPanel,其中包含一些应用程序特定的信息(我们称为 Legal.xaml 和 WhatsNew.xaml)。
\n\n理想情况下,这些应用程序特定的 XAML 文件应采用纯文本形式(而不是在代码中实例化的内容),以便可通过 HTTP 加载或作为嵌入式资源字符串加载。
\n\n加载 XAML 工作正常,直到我尝试将某些样式定义分解到另一个文件中,然后 XamlReader.Load() 失败并显示以下注释: \xe2\x80\x9cAttribute AboutPageDocs/CommonStyles.xaml 值超出范围。[行:43 位置:45]\xe2\x80\x9d
\n\n加载 Legal.xaml 时会发生该错误,当我们环顾四周时,如 43,我们发现我试图加载现在包含自定义样式的 ResourceDictionary:
\n\n<StackPanel.Resources>\n <ResourceDictionary>\n <ResourceDictionary.MergedDictionaries>\n <ResourceDictionary Source="AboutPageDocs/CommonStyles.xaml"/>\n </ResourceDictionary.MergedDictionaries>\n </ResourceDictionary>\n</StackPanel.Resources>\nRun Code Online (Sandbox Code Playgroud)\n\n这是错误的...如果简单地复制并粘贴 StackPanel 代码(在运行时动态加载)并将其放入 UserControl 中...一切工作正常。
\n\n不需要在 Legal.xaml 和 WhatsNew.xaml 中内联定义我的样式...有没有办法让 XamlReader.Load() 属性查找 CommonStyles.xaml?
\n\n考虑到源路径不正确,我尝试通过两个程序集将 CommonStyles.xaml 的副本放置在不同位置...并尝试使用 pack:// uri 语法...到目前为止都无济于事。
\n\n我缺少什么?
\nxamlreader ×10
wpf ×7
xaml ×7
c# ×6
datatemplate ×2
.net-4.0 ×1
binding ×1
eventtrigger ×1
silverlight ×1
xmlignore ×1