我有一个文件名为MainWindow.xaml
的XAML文件:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid x:Name="Content">
</Grid>
</Window>
现在,我想在C#中的项目中加载此文件,获取名称为 Content
的元素,添加Button
并保存文件。
var doc = XDocument.Load(@"MainWindow.xaml");
var gridElement = doc.Root.Element("Content"); // it is NULL
但我无法获取名为Content
的网格元素,为什么?
答案 0 :(得分:2)
发布另一个答案,因为第一个答案很有用,但没有立即满足您的要求
您提供给我们的文件无效。它没有关闭Window
标记。
您无法获取网格元素的原因是您尚未提供要使用的命名空间。由于Grid元素没有名称空间前缀,我们可以假设它的名称空间是文档的默认名称空间; http://schemas.microsoft.com/winfx/2006/xaml/presentation
。
我怎么知道文件的默认值呢?由于文档中的第2行:
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
修改强>
Element()
方法采用元素的xml名称 - 在这种情况下,您需要Grid
。然后你必须检查名称。
您可能希望简化代码。由于这是XAML,您可以对格式进行假设。例如,window只有一个子元素。
这是我的测试代码。这里有各种隐式运算符,这将使+
运算符编译,尽管类型很奇怪。别担心:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Xml.Linq;
namespace XamlLoad
{
class Program
{
static void Main(string[] args)
{
string file = @"<Window x:Class=""WpfApplication1.MainWindow""
xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""
xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml""
Title=""MainWindow"" Height=""350"" Width=""525"">
<Grid x:Name=""Content"">
</Grid>
</Window>";
var doc = XDocument.Load(new StringReader(file));
XNamespace xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation";
XNamespace x = "http://schemas.microsoft.com/winfx/2006/xaml";
var gridElement = doc.Root.Elements(xmlns + "Grid").Where(p => p.Attribute(x + "Name") != null && p.Attribute(x + "Name").Value == "Content");
}
}
}
答案 1 :(得分:0)
使用System.Windows.Markup.XamlReader
从流中加载文件。
XamlReader类
使用WPF默认值读取XAML输入并创建对象图 XAML阅读器和关联的XAML对象编写器。
http://msdn.microsoft.com/en-us/library/system.windows.markup.xamlreader.aspx
您必须将返回对象强制转换为根类型才能使用它。在这个例子中,根元素是
using(var fs = new FileStream("MainWindow.xaml"))
{
Window page = (Window)System.Windows.Markup.XamlReader.Load(fs);
}