问题标签 [xamlwriter]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
.net - 如何防止 XamlWriter.Save 序列化 BaseUri 属性?
我正在为 WPF 应用程序制作主题编辑器。我动态生成 XAML 文件,然后将它们编译成应用程序使用的 DLL。用于生成 XAML 文件的代码遵循以下几行:
我的问题是这XamlWriter.Save
也序列化了BaseUri
属性:
结果是,当应用程序尝试获取此图像时,它没有找到它,因为BaseUri
未设置。通常,XAML 解析器设置此属性(通过IUriContext
接口),但当它已在 XAML 中显式设置时,解析器不会设置它,因此它保持为空。
有没有办法防止XamlWriter
序列化BaseUri
属性?
如果我正在序列化一个自定义类,我可以添加一个ShouldSerializeBaseUri()
方法,或者IUriContext
显式实现(我尝试了这两个选项并且它们给出了所需的结果),但是如何做到这一点BitmapImage
呢?
作为最后的手段,我可以加载 XAML 文件并使用 Linq to XML 删除属性,但我希望有一个更干净的解决方案。
wpf - WPF:XamlWriter.Save 以不同方式保存“运行”内联 - 带有标签和不带标签(作为简单文本)
文本块有 3 个运行内联。我需要将它保存到 xml,并为此使用 XamlWriter.Save,结果我得到了这个:
问题是,这个 xaml 被解析为纯 xml,而不使用 wpf 框架。为了使解析器正常工作,我必须确保 xaml 呈现如下:
例如,每个内联都是一个单独的标签。我怎样才能做到这一点?我查看了 XamlWriter 和 Inlines 集合的属性和设置,但找不到与之对应的任何内容。
c# - TFS 2010:为什么不能反序列化字典当我可以使用 XamlReader 进行反序列化时,使用 XamlWriter.Save
上面的语句返回一个NotSupportedException
.
奇怪的是我可以使用XamlReader
来序列化字典。
XML:
c# - 在 BackgroundWorker 线程上创建 FlowDocument
FlowDocument
我需要从大量数据中动态生成一个。因为这个过程需要几分钟,我想在后台线程上执行操作而不是让 UI 挂起。
但是,我无法FlowDocument
在非 UI 线程上生成,否则尝试插入矩形和图像会导致运行时错误,抱怨它不是 STA 线程。
StackOverflow 上有几个线程似乎涉及我遇到的相同问题:
在第一个链接中,有人提出以下建议:
“我会做什么:使用 a
XamlWriter
并将其序列FlowDocument
化为XDocument
. 序列化任务涉及Dispatcher
,但是一旦完成,您可以根据需要对数据运行任意数量的古怪并行分析,并且 UI 中的任何内容都不会影响它。(同样,一旦它是一个XDocument
你查询它XPath
,这是一个非常好的锤子,只要你的问题实际上是钉子。)”
有人可以详细说明作者的意思吗?
wpf - WPF 中的简单 XAML 查看器
我需要将 WPF 控件的 XAML 写入字符串。我使用了 XamlWriter.Save()。它运作良好。我还需要在 VS Xaml 代码视图等编辑器(只读)中格式化、缩进和显示字符串。我不知道该怎么做。
请分享您的宝贵意见。
c# - 使用 XamlWriter 保存数组
我正在尝试以XamlWriter
最简单的方式保存一组对象。出于某种原因,将它们保存为数组会产生无效的 XML:
输出:
尝试使用XamlReader
throws 阅读此内容:
'[' 字符,十六进制值 0x5B,不能包含在名称中。第 1 行,第 7 位
我尝试另存为,List<T>
但我得到了通常的 XAML 泛型错误。有什么简单的方法可以做到(最好使用 LINQ)还是必须定义自己的包装器类型?
windows-runtime - 在 WinRT 中克隆 Xaml FramworkElement
我需要FrameworkELement
在 WinRT 中的 CodeBehind 中克隆一个 ...
我确实在互联网上找到了一个解决方案,尽管这种解决方法在 WinRT 中不起作用,因为它XamlWriter
在 winRT 中不可用!是否有一种简单/内置的方法来获取 XAML 元素的精确副本(克隆)?
还有其他方法可以获取 my 的另一个实例FrameworkElement
吗?
c# - 从 XamlWriter.Save(object obj, Stream stream) 中获取字符串
我可以从 中取回一个字符串XamlWriter.Save(myBF, stream)
吗?我需要它,所以将字符串保存在我的数据库中。我必须从这个答案的例子中改变什么
c# - 使用 XamlReader 和 XamlWriter 时将内容从一个 FlowDocument 插入另一个
我将 FlowDocument 与 BlockUIContainer 和 InlineUIContainer 元素一起使用,这些元素包含(或作为基类)一些自定义块 - SVG、数学公式等。因此,使用 Selection.Load(stream, DataFormats.XamlPackage) 将不起作用,因为序列化将删除 * UIContainers,除非 Child 属性是 Microsoft 参考源中可用的图像:
在这种情况下,唯一的选择是使用完美工作的 XamlWriter.Save 和 XamlReader.Load,序列化和反序列化 FlowDocument 的所有必需属性和对象,但必须手动实现 Copy+Paste 作为 Copy+ 的默认实现粘贴使用 Selection.Load/Save。
复制/粘贴非常重要,因为它还用于处理在 RichTextBox 控件中或之间拖动元素 - 这是无需自定义拖动代码即可操作对象的唯一方法。
这就是为什么我希望使用 FlowDocument 序列化来实现复制/粘贴,但不幸的是它存在一些问题:
- 在当前解决方案中,需要对整个 FlowDocument 对象进行序列化/反序列化。就性能而言,这应该不是问题,但我需要存储需要从中粘贴哪些选择范围的信息(CustomRichTextBoxTag 类)。
显然,对象不能从一个文档中删除并添加到另一个文档(我最近发现的一个死胡同):“InlineCollection”元素不能插入到树中,因为它已经是树的子节点。
我考虑在所有需要移动到另一个文档的元素中使用反射来设置 FrameworkContentElement._parent,但这是最后的手段 hackish 和肮脏的解决方案:
从理论上讲,我只能复制所需的对象:(可选)在选择开始时使用文本部分运行,中间的所有段落和内联以及(可能)在最后部分运行,将这些封装在自定义类中并使用序列化/反序列化XamlReader/XamlWriter。
- 另一个我没有想到的解决方案。
这是自定义的 RichTextBox 控件实现,其中包含部分工作的自定义复制/粘贴代码:
还有一个问题 - 是否存在使用 XamlReader 和 XamlWriter 为 FlowDocument 自定义复制+粘贴代码的现有解决方案?如何修复上面的代码,使其不会抱怨不同的 FlowDocument 对象或解决此限制?
编辑:作为一个实验,我实现了 2),以便可以将对象从一个 FlowDocument 移动到另一个。上面的代码已更新 - 所有对“字段”变量的引用。
c# - XamlWriter.Save() 未序列化 DependencyProperties
考虑我的 UserControl 中的以下 XAML:
以及相关的事件处理程序:
加载 TextBlock 时,会将以下输出写入控制台:
现在考虑这个替代 XAML:
现在,当加载 TextBlock 时,以下输出将写入控制台:
请注意,TextProperty 不再被序列化。
如果在调用 XamlWriter.Save() 之前添加了以下 TextProperty 分配:
然后在加载 TextBlock 时,将以下输出写入控制台:
请注意,TextProperty 再次被序列化。
这篇博客文章解释说“......如果属性由 DependencyProperty 支持......只有在实际设置时才写入该属性。”
似乎在第一个用法示例中确实设置了 TextProperty,但在 ListBox 和 DataTemplate 的第二个用法示例中没有设置。
谁能解释为什么会这样,以及如何克服这个障碍?
我最好的猜测是 XAML 解析器以某种方式在内部设置 TextBlock 状态,而不是在依赖属性上调用 SetValue,但我不确定它为什么只对 DataTemplate 中的元素执行此操作。