WPF 转换器转换导致 Visual Studio 设计器异常

Posted

技术标签:

【中文标题】WPF 转换器转换导致 Visual Studio 设计器异常【英文标题】:WPF Converter casting causes Visual Studio designer exception 【发布时间】:2011-01-03 02:12:08 【问题描述】:

如下所示的转换器将导致 2008 Visual Studio Designer 不显示 xaml,并出现“指定的转换无效”错误。例外。

public class ItemsVisibilityToGridColumnWidthConverter : IMultiValueConverter

    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    
        //THE TWO OFFENDING LINES...
        var itemsVisibility = (Visibility)values[0];
        var orientation = (Orientation)values[1];

        if (orientation == Orientation.Horizontal && itemsVisibility != Visibility.Visible)
        
            return new GridLength(0);
        

        return new GridLength(4, GridUnitType.Star);
    

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    
        throw new NotImplementedException();
    

更改演员表以使用这样的方法可以解决问题:

static class EnumCaster

    internal static Orientation CastAsOrientation(object value)
    
        if (value is Enum)
        
            return (Orientation)value;
        
        return Orientation.Horizontal;
    
    internal static Visibility CastAsVisibility(object value)
    
        if (value is Enum)
        
            return (Visibility)value;
        
        return Visibility.Visible;
    

我的问题是,Visual Studio 设计器的 wtf 有问题吗?而且,有没有更好的方法将这些对象投射到它们对应的 Enum 中,这样设计者就不会出错?

【问题讨论】:

"wtf 是不是 Visual Studio 设计器有问题?"我有一个列表,但是这个 Internet 太小,无法包含它。 你能在你使用这个转换器的地方发布 XAML 吗? 【参考方案1】:

我认为这可能会发生,因为有时会使用错误的参数调用转换器。您可以按照以下步骤在设计器中调试调用转换器:

启动新的 Visual Studio 实例 附加到第一个 VS 实例(工具 -> 附加到进程) 打开转换器源文件 在 Convert 方法中设置断点 在第一个 VS 实例中重新加载 WPF 设计器

这样你应该能够检查传递给转换器的参数

【讨论】:

设计器正在发送一个 DependencyProperty.UnsetValue。感谢您提供有关调试设计器的提示。 从 Visual Studio 2012 开始,WPF 设计器在名为 XDesProc.exe 的单独进程中运行。您应该从 Visual Studio 的新实例附加到此进程。【参考方案2】:

我认为设计者正在处理第一个示例中的转换器并且无法转换,因为 values[0] 和 values[1] 为空。如果您确实检查 null 那么这应该可以解决问题。第二个示例本质上是在使用“is”关键字时检查 null。

【讨论】:

将 null 转换为任何东西(引用类型)不会引发异常。更可能的原因是 values[0] 和 values[1] 应该互换... @Aviad,枚举不是引用类型,它们是值类型...将 null 转换为值类型会引发 NullReferenceException

以上是关于WPF 转换器转换导致 Visual Studio 设计器异常的主要内容,如果未能解决你的问题,请参考以下文章

为什么VS(visual studio)中会建议宏 #define 转换为constexpr?

将 C++ 项目从 Visual Studio 2008 转换为 Visual Studio 2010

从 Visual Studio 2013 转换到 Visual Studio 2015 的问题

是否需要将 Visual Studio Express 解决方案转换为 Visual Studio Professional 解决方案?

Visual Studio 与code 进行主题转换

使用部分类和设计器文件将 Visual Studio 2003 表单转换为 Visual Studio 2005/2008 表单