【问题标题】:Radwindow after Catel Update to 5.0Catel 更新到 5.0 后的 Radwindow
【发布时间】:2017-08-18 22:01:51
【问题描述】:

升级到 Catel 5.0 后,我开始出现如下异常:

“System.EventHandler”类型的对象无法转换为“System.EventHandler`1[Telerik.Windows.Controls.WindowClosedEventArgs]”类型。

在 System.RuntimeType.TryChangeType(Object value, Binder binder, CultureInfoculture, Boolean needsSpecialCast) 在 System.Reflection.MethodBase.CheckArguments(Object[] 参数,Binding 活页夹,BindingFlags invokeAttr,CultureInfo 文化,签名 sig) 在 System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck(Object obj,BindingFlags invokeAttr,Binder binder,Object[] 参数,CultureInfo 文化) 在 System.Reflection.RuntimeMethodInfo.Invoke(Object obj,BindingFlags invokeAttr,Binder binder,Object[] 参数,CultureInfo 文化) 在 C:\CI_WS\Ws\103722\Source\Catel\src\Catel.MVVM\Catel.MVVM.Shared\Services 中的 Catel.Services.UIVisualizerService.HandleCloseSubscription(对象窗口,对象数据,EventHandler`1 completedProc,布尔 isModal) \UIVisualizerService.wpf.cs:第 141 行 在 C:\CI_WS\Ws\103722\Source\Catel\src\Catel.MVVM\Catel.MVVM.Shared\Services\UIVisualizerService.wpf 中的 Catel.Services.UIVisualizerService.ShowWindowAsync(FrameworkElement 窗口,对象数据,布尔 showModal)。 CS:第 155 行 在 C:\CI_WS\Ws\103722\Source\Catel\src\Catel.MVVM\Catel.MVVM.Shared\Services\UIVisualizerService.cs:line 222 中的 Catel.Services.UIVisualizerService.d__15.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()

在实现 IDatawindow 接口时,我基本上已将所有窗口(消息框、模型窗口和主 shell)设置为从 Radwindow 继承,当我尝试使用“IUIVisualizerService”时会发生这种情况。下面是一个示例:

public class MessageService : Catel.Services.MessageService, IAppMessageService
{...
public MessageService(IDispatcherService dispatcherService, IUIVisualizerService uiVisualizerService, IViewModelFactory viewModelFactory)
        : base(dispatcherService)
    {
        Argument.IsNotNull(() => dispatcherService);
        Argument.IsNotNull(() => uiVisualizerService);
        Argument.IsNotNull(() => viewModelFactory);

        this._dispatcherService = dispatcherService;
        this._uiVisualizerService = uiVisualizerService;
        this._viewModelFactory = viewModelFactory;
    }
public override Task<MessageResult> ShowAsync(string message, string caption = "", MessageButton button = MessageButton.OK, MessageImage icon = MessageImage.None)
    {...
this._dispatcherService.BeginInvoke(async () =>
        {
            var previousCursor = Mouse.OverrideCursor;
            Mouse.OverrideCursor = null;

            var vm = this._viewModelFactory.CreateViewModel<MessageBoxViewModel>(null, null);

            vm.Message = message;
            vm.Button = button;
            vm.Icon = icon;
            vm.SetTitle(caption);

            await this._uiVisualizerService.ShowDialogAsync(vm);

尝试显示如上所示对话框时发生错误。

我正在使用 Orchestra 源代码中提供的确切示例:

private readonly WindowLogic _logic;
    private event EventHandler<EventArgs> ViewLoaded;
    private event EventHandler<EventArgs> ViewUnloaded;
    private event EventHandler<DataContextChangedEventArgs> ViewDataContextChanged;
    private event EventHandler<WindowClosedEventArgs> ViewClosed;

    public AppMessageBoxWindow() : this(null) { }

    public AppMessageBoxWindow(IViewModel viewModel)
    {
        GetAndSetIcon();
        this.FixBlurriness();
        this.SizeToContent = true;
        this.ResizeMode = ResizeMode.NoResize;
        this.WindowStartupLocation = WindowStartupLocation.CenterOwner;

        this._logic = new WindowLogic(this, null, viewModel);
        this._logic.ViewModelChanged += (sender, args) => ViewModelChanged.SafeInvoke(this, args);
        this._logic.PropertyChanged += (sender, args) => PropertyChanged.SafeInvoke(this, args);
        this._logic.ViewModelPropertyChanged += (sender, e) => ViewModelPropertyChanged.SafeInvoke(this, e);

        Loaded += (sender, args) => ViewLoaded.SafeInvoke(this, args);
        Unloaded += (sender, args) => ViewUnloaded.SafeInvoke(this);
        DataContextChanged += (sender, e) => ViewDataContextChanged.SafeInvoke(this, new DataContextChangedEventArgs(e.OldValue, e.NewValue));

        OnViewModelChanged();
    }

    public IViewModel ViewModel => this._logic.ViewModel;
    private void GetAndSetIcon()
    {
        this.Icon = new Image { Source = new BitmapImage(ImagesUri.AppIcon) };
    }
    public event PropertyChangedEventHandler PropertyChanged;
    public event EventHandler<EventArgs> ViewModelChanged;
    public event EventHandler<PropertyChangedEventArgs> ViewModelPropertyChanged;
    event EventHandler<EventArgs> IView.Loaded
    {
        add { ViewLoaded += value; }
        remove { ViewLoaded += value; }
    }
    event EventHandler<EventArgs> IView.Unloaded
    {
        add { ViewUnloaded += value; }
        remove { ViewUnloaded += value; }
    }
    event EventHandler<DataContextChangedEventArgs> IView.DataContextChanged
    {
        add { ViewDataContextChanged += value; }
        remove { ViewDataContextChanged += value; }
    }
    private void OnViewModelChanged()
    {
        if (ViewModel != null && !ViewModel.IsClosed)
        {
            ViewModel.ClosedAsync += ViewModelClosed;
        }
    }
    private Task ViewModelClosed(object sender, ViewModelClosedEventArgs e)
    {
        Close();
        return TaskHelper.Completed;
    }
        }

看起来这可能是在 UIVisualizerService 中处理关闭事件时发生的。

【问题讨论】:

    标签: c# wpf mvvm catel radwindow


    【解决方案1】:

    这可能是由于 WeakEventListener 的新实现引起的错误。请通过https://github.com/catel/catel 的repro(没有任何第三方库)报告此问题

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-06
      • 2021-05-24
      • 1970-01-01
      • 1970-01-01
      • 2018-12-13
      • 1970-01-01
      • 2017-02-15
      相关资源
      最近更新 更多