【问题标题】:Fixing ArgumentException in UWP enum DependencyProperty修复 UWP 枚举 DependencyProperty 中的 ArgumentException
【发布时间】:2017-09-29 01:54:41
【问题描述】:

我在 UWP 应用中有以下代码:

public sealed partial class CanvasMapControl : UserControl
{
    public static readonly DependencyProperty ActiveInteractionModeProperty =
        DependencyProperty.Register(nameof(ActiveInteractionMode),
                                    typeof(InteractionMode),
                                    typeof(CanvasMapControl),
                                    new PropertyMetadata(InteractionMode.None, CanvasMapControl_InteractionModeChanged));

    public InteractionMode ActiveInteractionMode {
        get => (InteractionMode)GetValue(ActiveInteractionModeProperty);
        set => SetValue(ActiveInteractionModeProperty, value);
    }

    private static void CanvasMapControl_InteractionModeChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
    {
        ((CanvasMapControl)obj).InteractionModeInternal = (InteractionMode)args.NewValue;
    }

    // ...rest of class...
}

InteractionMode 是一个枚举。当我尝试运行我的应用程序时,出现以下异常:

System.TypeInitializationException: 'MyApp.CanvasMapControl' 的类型初始化器引发了异常。'

内部异常

ArgumentException:参数不正确。创建默认值回调

我尝试过的事情:

  • 将 DependencyProperty 更改为 int 并进行强制转换
  • 为 PropertyMetadata 传递 null
  • 为 PropertyMetadata 的默认值传递 null
  • 传递函数而不是默认值

无论我尝试什么,在启动时它总是会抛出上述针对 ActiveInteractionMode 的 SetValue 行的异常。我错过了什么导致这不起作用?


更新:InteractionModeInternal 是一个简单的私有属性,用于允许我在处理期间临时更改 ActiveInteractionMode

private InteractionMode _interactionModeInternal;

private InteractionMode InteractionModeInternal
{
    get => _interactionModeInternal;
    set
    {
        _interactionModeInternal = value;
        OnInteractionModeInternalChanged(value);
    }
}

private void OnInteractionModeInternalChanged(InteractionMode interactionMode)
{
    Log.Debug($"InternalInteractionMode changed to {interactionMode}");
}

我目前没有任何逻辑驱动它,除了它将一个字符串记录到控制台。


更新 2:经过进一步调试,我发现启动时发生崩溃的原因是我在 XAML 中将值绑定到这些属性。注释掉这些绑定后,应用程序能够启动,但尝试访问 ActiveInteractionMode 的 Get 或 Set 将导致 createDefaultValueCallback 发生同样的错误。

【问题讨论】:

  • 如果您将new PropertyMetadata(InteractionMode.None, ...)); 行更改为:new PropertyMetadata(DependencyProperty.UnsetValue, ...));
  • @Laith 无效。同样的问题。
  • 您可以尝试关闭Visual Studio,并在您的代码的解决方案目录中,删除所有binobj 目录。我感觉有些东西被锁定了,您的自动生成的代码隐藏没有更新。
  • @Laith Closed VS,删除解决方案中所有项目的 bin 和 obj 文件夹。当我打开它备份时,它很难找到很多框架类,但是在进行包还原(表示所有内容都已下载)后,它找到了它们。但是在运行应用程序时,同样的问题。
  • 你能提供更多关于InteractionModeInternal的房产的细节吗?

标签: c# enums uwp dependency-properties argumentexception


【解决方案1】:

我通过您提供段代码编写了一个示例。我试图重现您的问题。但是我的项目中没有出现这个问题。我已经将code sample 上传到了github。请检查。以下代码为自定义控件,您可以对比下面的代码来判断您的项目是否有问题。

 public enum InteractionMode
 {
  None,
  Initiative,
  Passive
 }

 public sealed partial class CustomUserControl : UserControl
 {
     public CustomUserControl()
     {
         this.InitializeComponent();
     }

 public InteractionMode ActiveInteractionMode
 {
     get { return (InteractionMode)GetValue(ActiveInteractionModeProperty); }
     set { SetValue(ActiveInteractionModeProperty, value); }
 }

 public static readonly DependencyProperty ActiveInteractionModeProperty =
     DependencyProperty.Register("ActiveInteractionMode", typeof(InteractionMode), typeof(CustomUserControl), new PropertyMetadata(InteractionMode.None, CanvasMapControl_InteractionModeChanged));

 private static void CanvasMapControl_InteractionModeChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
 {
     if (args.OldValue != args.NewValue)
     {
         ((CustomUserControl)obj).InteractionModeInternal = (InteractionMode)args.NewValue;
     }
 }

 private InteractionMode _interactionModeInternal;

 private InteractionMode InteractionModeInternal
 {
     get
     {
         return _interactionModeInternal;
     }

     set
     {
         _interactionModeInternal = value;
         OnInteractionModeInternalChanged(value);
     }
 }

 private void OnInteractionModeInternalChanged(InteractionMode interactionMode)
 {
     System.Diagnostics.Debug.WriteLine($"InternalInteractionMode changed to {interactionMode}");
 }

【讨论】:

    【解决方案2】:

    如果将来有人遇到此问题,我会将其发布为答案,因为它确定了我遇到的具体问题。我不知道我是否做错了什么,或者这是否是 UWP 或我手机中的错误,但我不再拥有此代码,因此无法进一步调试。

    更新2:经过进一步调试,我找到了崩溃的原因 启动时发生的是我将值绑定到这些属性 XAML。在注释掉这些绑定后,应用程序能够 启动,但随后尝试访问 Get 或 Set for ActiveInteractionMode 会导致同样的错误 createDefaultValueCallback 发生。

    【讨论】:

      猜你喜欢
      • 2016-07-31
      • 2013-07-26
      • 1970-01-01
      • 2023-03-18
      • 2017-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-08
      相关资源
      最近更新 更多