[英]Radwindow after Catel Update to 5.0
升級到Catel 5.0后,我開始收到如下所示的異常:
類型'System.EventHandler'的對象不能轉換為類型'System.EventHandler`1 [Telerik.Windows.Controls.WindowClosedEventArgs]'。
System.Reflection.MethodBase.CheckArguments(Object []參數,Binder活頁夾,BindingFlags invokeAttr,CultureInfo文化,Signature sig)位於System.Reflection.MethodBase.CheckArguments(Object []參數,Binder活頁夾,BindingFlags invokeAttr,CultureInfo文化,簽名sig)。卡特爾的RuntimeMethodInfo.InvokeArgumentsCheck(對象obj,BindingFlags invokeAttr,活頁夾活頁夾,Object []參數,CultureInfo文化)在卡特爾。 C:\\ CI_WS \\ Ws \\ 103722 \\ Source \\ Catel \\ src \\ Catel.MVVM \\ Catel.MVVM.Shared \\ Services \\ UIVisualizerService中的Services.UIVisualizerService.HandleCloseSubscription(對象窗口,對象數據,EventHandler`1completeProc,布爾值isModal)。 wpf.cs:Catel.Services.UIVisualizerService.ShowWindowAsync(FrameworkElement窗口,Object data,Boolean showModal)中的141行,位於C:\\ CI_WS \\ Ws \\ 103722 \\ Source \\ Catel \\ src \\ Catel.MVVM \\ Catel.MVVM.Shared \\服務\\ UIVisualizer Service.wpf.cs:Catel.Services.UIVisualizerService.d__15.MoveNext()中的155行位於C:\\ CI_WS \\ Ws \\ 103722 \\ Source \\ Catel \\ src \\ Catel.MVVM \\ Catel.MVVM.Shared \\ Services \\ UIVisualizerService中。 cs:line 222 ---從上一個引發異常的位置開始的堆棧跟蹤---在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
我基本上已經將所有窗口(消息框,模型窗口和主外殼)設置為在實現IDatawindow接口時從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中的close事件時發生的。
這可能是由WeakEventListener的新實現引起的錯誤。 請在https://github.com/catel/catel上使用repro(無任何第三方庫)報告此問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.