【问题标题】:WPF Converter casting causes Visual Studio designer exceptionWPF 转换器转换导致 Visual Studio 设计器异常
【发布时间】: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 吗?

标签: c# wpf visual-studio visual-studio-2008


【解决方案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
猜你喜欢
  • 1970-01-01
  • 2011-05-29
  • 1970-01-01
  • 2016-06-20
  • 2023-04-07
  • 1970-01-01
  • 2018-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多