WPF parse web.config recursively, TreeView and HierarchicalDataTemplate

<Window x:Class="WpfApp13.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp13"
        mc:Ignorable="d"
        Title="MainWindow"
        WindowState="Maximized">
    <Window.DataContext>
        <local:MainVM/>
    </Window.DataContext>
    <Window.Resources>
        <Style TargetType="TextBlock" x:Key="TbkStyle">
            <Setter Property="FontSize" Value="30"/>
            <Setter Property="FontWeight" Value="Normal"/>
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="Foreground" Value="Red"/>
                </Trigger>
            </Style.Triggers>
        </Style>

        <Style TargetType="TreeViewItem">
            <Setter Property="IsExpanded" Value="True"/>
        </Style>
        
        <HierarchicalDataTemplate DataType="{x:Type local:XmlNode}" x:Key="XmlNodeDataTemplate"
                                  ItemsSource="{Binding XmlNodeChildren}">
            <Grid>
                <Grid.Resources>
                    <Style TargetType="TextBlock" BasedOn="{StaticResource TbkStyle}"/>
                </Grid.Resources>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto" SharedSizeGroup="NameGroup"/>
                    <ColumnDefinition Width="Auto"/>
                    <ColumnDefinition Width="Auto" SharedSizeGroup="ValueGroup"/>
                </Grid.ColumnDefinitions>
                <TextBlock Text="{Binding NodeName}" Grid.Column="0"/>
                <TextBlock Text="{Binding NodeValue}" Grid.Column="2"/>
            </Grid> 
        </HierarchicalDataTemplate>      
    </Window.Resources>
    <Grid Grid.IsSharedSizeScope="True">
        <TreeView
            ItemsSource="{Binding ConfigNodes}"
            ItemTemplate="{StaticResource XmlNodeDataTemplate}"/>
    </Grid>
</Window>


using System.Collections.ObjectModel;
using System.ComponentModel;
using System.IO;
using System.Runtime.CompilerServices;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Xml;

namespace WpfApp13
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }

    public class MainVM : INotifyPropertyChanged
    {
        public MainVM()
        {
            ReadXmlFile();
        }

        private void ReadXmlFile()
        {
            string xmlFile = "../../../web.config";
            if(File.Exists(xmlFile))
            {
                try
                {
                    string xmlStr = File.ReadAllText(xmlFile);
                    XmlDocument xmlDoc = new XmlDocument();
                    xmlDoc.LoadXml(xmlStr);
                    var node = ConvertToXmlNode(xmlDoc.DocumentElement);
                    ConfigNodes = new ObservableCollection<XmlNode>();
                    ConfigNodes.Add(node);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex?.Message);                     
                }
                
            }
        }

        private ObservableCollection<XmlNode> configNodes;
        public ObservableCollection<XmlNode> ConfigNodes
        {
            get
            {
                return configNodes;
            }
            set
            {
                if(configNodes!=value)
                {
                    configNodes = value;
                    OnPropertyChanged();
                }
            }
        }

        public event PropertyChangedEventHandler? PropertyChanged;
        private void OnPropertyChanged([CallerMemberName] string propertyName = "")
        {
            var handler = Volatile.Read(ref PropertyChanged);
            if (handler == null)
            {
                return;
            }
            handler(this, new PropertyChangedEventArgs(propertyName));
        }

        private XmlNode ConvertToXmlNode(XmlElement elem)
        {
            XmlNode node = new XmlNode();
            node.NodeName= elem.Name;

            foreach(XmlAttribute attr in elem.Attributes)
            {
                node.XmlNodeChildren.Add(new XmlNode()
                {
                    NodeName = attr.Name,
                    NodeValue = attr.Value,
                });
            }

            foreach (var child in elem.ChildNodes)
            {
                var childNode = child as XmlElement;
                if(childNode!=null)
                {
                    node.XmlNodeChildren.Add(ConvertToXmlNode(childNode));
                }
            }
            return node;
        }
    }

    public class XmlNode
    {
        public string NodeName { get; set; }
        public string NodeValue { get; set; }
        public List<XmlNode> XmlNodeChildren { get; set; }

        public XmlNode()
        {
            XmlNodeChildren = new List<XmlNode>();
        }
    }
}


//D:\C\WpfApp13\WpfApp13\Web.config
<?xml version="1.0"?>
<configuration>
    <appSettings>
        <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true"/>
    </appSettings>
    <!--
    For a description of web.config changes see http://go.microsoft.com/fwlink/?LinkId=235367.

    The following attributes can be set on the <httpRuntime> tag.
      <system.Web>
        <httpRuntime targetFramework="4.8" />
      </system.Web>
  -->
    <system.web>
        <compilation debug="true" targetFramework="4.8"/>
        <httpRuntime targetFramework="4.7.2"/>
    </system.web>
    <system.serviceModel>
        <bindings>
            <webHttpBinding>
                <binding name="BookServiceBinding"
                         maxBufferPoolSize="2147483647"
                         maxBufferSize="2147483647"
                         maxReceivedMessageSize="2147483647">
                    <readerQuotas maxArrayLength="2147483647"
                                  maxBytesPerRead="2147483647"
                                  maxDepth="2147483647"
                                  maxNameTableCharCount="2147483647"
                                  maxStringContentLength="2147483647"/>
                    <security mode="None"/>
                </binding>
            </webHttpBinding>
        </bindings>
        <behaviors>
            <serviceBehaviors>
                <behavior name="BookServiceBahavior">
                    <!-- To avoid disclosing metadata information, set the values below to false before deployment -->
                    <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
                    <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
                    <serviceDebug includeExceptionDetailInFaults="false"/>
                </behavior>
            </serviceBehaviors>
            <endpointBehaviors>
                <behavior name="BookServiceEndPointBehavior">
                    <webHttp/>
                </behavior>                          
            </endpointBehaviors>
        </behaviors>
        <protocolMapping>
            <add binding="basicHttpsBinding" scheme="https"/>
        </protocolMapping>
        <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/>
        <services>
            <service name="WcfService5.BookService"
                     behaviorConfiguration="BookServiceBahavior">
                <endpoint address=""
                          binding="webHttpBinding"
                          contract="WcfService5.IBookService"
                          behaviorConfiguration="BookServiceEndPointBehavior"
                          bindingConfiguration="BookServiceBinding"/>
            </service>
        </services>
    </system.serviceModel>
    <system.webServer>
        <modules runAllManagedModulesForAllRequests="true"/>
        <!--
        To browse web app root directory during debugging, set the value below to true.
        Set to false before deployment to avoid disclosing web app folder information.
      -->
        <directoryBrowse enabled="true"/>
    </system.webServer>
</configuration>

 

 

 

 

 

 

 

image

 

 

 

 

 

 

image

 

 

 

image

 

posted @ 2026-08-15 21:54  FredGrit  阅读(4)  评论(0)    收藏  举报