作为一个学习练习,我尝试从一个文件中加载一个带有XML数据的WPF TreeView控件,并且只使用XAML。我使用this example作为指导。
我花了两天时间才让它在Visual Studio 2022中工作,项目类型为 WPF Desktop and .NET 6.0(TargetFramework=net6.0-windows
)。嗯,我无法让它工作。我随意创建了一个类型为 WPF .NET Framework 4.7.2(TargetFramework=v4.7.2
)的新项目。这起作用了。
顺便说一句:对于.NET6.0项目,数据显示在设计器中,但不在运行时显示。
我对. NET的所有版本都很困惑。我打算用C#/WPF为Windows 10编写一个小应用程序,我不知道该创建哪种类型的项目。我认为.NET 6.0是 * 未来 *。有人能解释一下为什么代码不起作用,并建议我如何继续吗?非常感谢。
代码:
<Window x:Class="XMLTreeView.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:XMLTreeView"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Window.Resources>
<XmlDataProvider x:Key="XmlData" Source="Tree.xml" XPath="Folders"/>
<HierarchicalDataTemplate x:Key="ItemTemplate" ItemsSource="{Binding XPath=./Folder}">
<TextBlock Text="{Binding XPath=@Name}"/>
</HierarchicalDataTemplate>
</Window.Resources>
<Grid>
<TreeView Width="400"
ItemsSource="{Binding Source={StaticResource XmlData}}"
ItemTemplate="{Binding Source={StaticResource ItemTemplate}}"/>
</Grid>
</Window>
文件:
<Folders>
<Folder Name="Adolph Henselt">
<Folder Name="Henselt Piano Works" />
</Folder>
<Folder Name="Alexander Borodin">
<Folder Name="String Quartet Nos. 1 and 2" />
<Folder Name="Symphony No. 2, Polovtsian Dances" />
</Folder>
....
</Folders
此致!
鲍勃
2条答案
按热度按时间h9vpoimq1#
我能够让演示工作,但必须注意几件事:
首先,在Visual Studio的“XAML绑定失败”选项卡下,我收到一个错误,说明**“XmlDataProvider无法从源加载异步文档,因为XML中存在加载或解析错误...无法定位资源”tree.xml“"**
对XML路径进行硬编码,如下图所示:
虽然从XML加载的模拟数据非常适合于生成原型,但由于其静态特性,实际上在真实的生活中并不常见。
如果这是您第一次尝试使用WPF,我建议您熟悉MVVM模式和XAML中的数据绑定,(请出于对所有神圣事物的热爱,不要使用代码背后的代码)https://learn.microsoft.com/en-us/dotnet/desktop/wpf/data/?view=netdesktop-6.0
至于.Net6和它的未来。是的!它是为了让我们更接近“一次编写,随处运行”的圣杯。它不是没有缺点,但知道如何通过应用每个人都在宣扬的分层体系结构原则将代码与UI分离,将在长期可维护性方面带来好处。
j1dl9f462#
在Anthony的帖子的帮助下,我发现了这一点。它让我开始思考Visual Studio本身。我发现的是:
在创建.NET Framework 4.7.2项目之后,我添加了XML文件,并将选项 Copy to Output Directory 设置为“Copy if newer”。在创建.NET 6.0项目时,我做了同样的事情。
但我忽略了一点,默认情况下,.NET Framework项目将 Build Action 设置为Resource,而.NET 6.0项目将其设置为None。当我将 Build Action 更改为Resource时,.NET 6.0项目在没有任何其他更改的情况下正常工作。
这只是一个学习练习。实际上,TreeView将使用您建议的MVVM模式用CLR对象填充。
非常感谢您的光临。
鲍勃