WPF TreeView代码段在.NET Framework 4.7.2中有效,但在.NET 6.0中无效

dfty9e19  于 2022-11-18  发布在  .NET
关注(0)|答案(2)|浏览(129)

作为一个学习练习,我尝试从一个文件中加载一个带有XML数据的WPF TreeView控件,并且只使用XAML。我使用this example作为指导。
我花了两天时间才让它在Visual Studio 2022中工作,项目类型为 WPF Desktop and .NET 6.0TargetFramework=net6.0-windows)。嗯,我无法让它工作。我随意创建了一个类型为 WPF .NET Framework 4.7.2TargetFramework=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

此致!
鲍勃

h9vpoimq

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分离,将在长期可维护性方面带来好处。

j1dl9f46

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对象填充。
非常感谢您的光临。
鲍勃

相关问题