【问题标题】:XAML designer shows error after program has run and does not display correctlyXAML 设计器在程序运行后显示错误并且无法正确显示
【发布时间】:2023-03-04 03:08:01
【问题描述】:

当我将鼠标悬停在带有蓝色下划线的文本上时,XAML 设计器会显示一个奇怪的错误。它还拒绝在预览中正确显示组件。文字很简单

Object reference not set to an instance of an object.

这看起来像NullReferenceException,但我不知道它来自哪里。它在启动的应用程序中正确显示。

它实际上似乎与从List<string> 继承并公开一个可设置的属性有关。如果我删除其中任何一个,它就可以工作。但我想要两者都用于我的转换器。

要重现它,只需创建一个空的 WPF .NET Framework 项目,并将其粘贴到命名空间内的 MainWindow.xaml.cs 代码下方:

    public class BuggyConverter : List<string>, IMultiValueConverter
    {
        public object Value { get; set; }

        public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        => Visibility.Visible;

        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) => null;
    }

然后这个进入MainWindow.xaml:

<Window...>
    <Window.Resources>
        <local:BuggyConverter x:Key="conv" Value="{x:Static Brushes.Yellow}" />
    </Window.Resources>
    <Grid>
        <Border Visibility="{MultiBinding Converter={StaticResource conv}}" />
        
        <ItemsControl>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Grid Visibility="{MultiBinding Converter={StaticResource conv}}" Width="100" Height="100" Background="{Binding}" />
                </DataTemplate>
            </ItemsControl.ItemTemplate>
            <ItemsControl.ItemsSource>
                <x:Array Type="{x:Type Brush}">
                    <SolidColorBrush Color="Green" />
                    <SolidColorBrush Color="Red" />
                </x:Array>
            </ItemsControl.ItemsSource>
        </ItemsControl>
    </Grid>
</Window>

保持MainWindow.xaml 处于打开状态,然后通过“开始”按钮启动应用程序。你可以看到一个绿色和一个红色的方块。由于这是在 XAML 中硬编码的,因此我希望设计人员能够展示这一点。

相反,当您退出应用程序时,设计器会显示颜色十六进制代码而不是彩色方块,这似乎是因为转换器设置存在问题。

有什么问题?

【问题讨论】:

  • 你想要完成的最终结果是什么?在 DataTemplate 级别,您正在查看单个项目(画笔)但尝试使用 MultiBinding?您是否正在尝试覆盖绑定中的值? (如果红色则黄色等)
  • @KevinCook 这只是一个非常精简的例子。我想确定是否根据多个属性启用了某些功能,这些属性通过MultiBinding 转换为单个bool 值。我不需要帮助,但我希望能够在设计时预览我的模板(这显然在运行时工作),但 XAML 设计器不知何故放弃了。
  • 您可能应该花一些时间查看转换器和绑定的示例,该代码有效(实际上并没有,但就像人们在学校失败一样,尽管代码是坏的)。您的多重绑定没有被绑定(因此出现错误),并且您的示例甚至没有办法在您尝试使用它的级别为其绑定多个项目,因为您的列表只有一个对象而不是一类对象,而您正试图在行级别使用它。
  • @KevinCook 我的回复不断被删除,不知道是谁删除的。该错误与您编写的任何内容都无关。请不要发布错误信息。

标签: c# wpf xaml xaml-designer


【解决方案1】:

您提供的代码在我这边运行良好。我认为您发布的这段代码仅适用于 StackOverflow,您的实际代码可能会有所不同。无论如何,我对空引用异常的有根据的猜测是,公共对象值{get;放;} 每次您尝试转换某些东西(在您的实际用例场景中)时都会变为 null

如果您提供的代码正是您正在使用的代码,那么只需尝试构建您的项目以查看该空引用是否错误 消失或尝试以下步骤

  1. 从此类项目中清空您的 bin/debug 文件夹
  2. 重启你的IDE
  3. 构建您的项目

【讨论】:

  • 感谢您的调查!我专门尽可能地压缩了我的代码,甚至用一个新的 WPF 项目检查它,插入它,它仍然坏掉了。问题出现在我关闭正在运行的应用程序的窗口之后。我什至没有使用Value!清除 bin/obj/.vs 文件夹是我很清楚的标准 XAML 虚假错误删除程序。也许它只会影响我的机器......:P
  • 我刚刚在另一台 PC 上尝试过,即使安装了 Resharper,同样的问题。您是否严格按照说明进行操作?您的 XAML 设计器看起来不错,但我的没有显示出来。该错误仅在程序第一次关闭后出现。
  • @AyCe 是的,我使用了给定的确切代码,它对我有用,没有任何问题。如果你愿意,我可以在 Github 上证明这一点,你可以下载它。此外,您可以检查您正在使用的绑定或转换器。也许在这些领域可能有些东西不能正常工作。
  • 如果它对你有用,但完全相同的代码在两台不同的机器上对我不起作用......问题可能是什么?我创建了新的解决方案,只是将代码粘贴到文件中,运行它们,然后在关闭窗口时,两次都出现错误。你看到了绑定和转换器。我想这只是 XAML 设计者奇怪的又一个例子。 :( 但感谢您对其进行测试!
猜你喜欢
  • 2020-02-03
  • 2021-09-07
  • 1970-01-01
  • 1970-01-01
  • 2017-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-29
相关资源
最近更新 更多