繁体   English   中英

使用Linq从XML源文件构造wpf超链接元素列表

[英]Construct a list of wpf Hyperlink elements from an XML source file using Linq

我有一个如下的xml文件:

<Links>
    <Link>
        <Text>Google</Text>
        <Uri>http://www.google.com</Uri>
    </Link>
    <Link>
        <Text>Yahoo</Text>
        <Uri>http://www.yahoo.co.uk</Uri>
    </Link>
</Links>

从中,我想构建一堆包含以下内容的超链接元素

  • 显示文字
  • URI
  • 导航到URI的方法

显然,有很多解决方法,从历史上看,我可能会做这样的事情:

List<ACMEXmlNode> nodes = ACMEXmlParser.GetNodes("Link", targetDoc);
List<Hyperlink>;
foreach (var node in nodes) {
    var currentLink = new Hyperlink();
    currentLink.Uri = node.ChildNode("Uri").Value;

    // Can't work out how to do the below line in a linq statement
    currentLink.ContentStart.InsertTextInRun(node.ChildNode("Text").Value);

    currentLink.RequestNavigate += this.DoBrowserNavigate;
}

但是,我也在尝试学习Linq,这似乎应该是它的典型用例。 谁能帮助我完成与此类似的事情? 到目前为止,我有:

_Links = new List<Hyperlink>(
                        from linkElement in oLinksConfig.Descendants("Links")
                        select new Hyperlink
                            {
                                NavigateUri = new System.Uri(linkElement.Element("Uri").Value ),

                                // Fails...
                                ContentStart.InsertTextInRun(linkElement.Element("Text").Value)
                            }
                        ).ToList();

这不起作用。 如果有人可以告诉我如何修复它,我将不胜感激。

您的问题不在于LINQ本身,而在于您选择的LINQ语法以及您有一个陈述的事实:

ContentStart.InsertTextInRun(linkElement.Element("Text").Value)

对象初始化程序块中。

而是使用类似以下内容的东西:

var links = oLinksConfig
    .Descendants("Links")
    .Select(
        linkElement =>
        {
            var link = new HyperLink { /* your initializations of properties with setters */ };

            //statements are after you have an instance of the class
            link.ContentStart.InsertTextInRun(linkElement.Element("Text").Value;
            return link;
         })
     .ToList();

您可以尝试以下方法:

_Links = nodes.Select(node => {
             var currentLink = new Hyperlink();
             currentLink.NavigateUri = new Uri(node.Element("Uri").Value);
             currentLink.ContentStart
                        .InsertTextInRun(node.Element("Text").Value);
             currentLink.RequestNavigate += this.DoBrowserNavigate;
             return currentLink;
         }).ToList();

如果您希望输入只是纯XML文件,请尝试以下操作:

_Links = oLinksConfig.Descendants("Link")
            .Select(link => {
                  var currentLink = new Hyperlink();
                  currentLink.NavigateUri = new Uri(link.Element("Uri").Value);
                  currentLink.ContentStart
                             .InsertTextInRun(link.Element("Text").Value);
                  currentLink.RequestNavigate += this.DoBrowserNavigate;
                  return currentLink;
             }).ToList();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM