C# 使用Caliburn.Micro.Contrib通用对话框
我对C#编程相当陌生。我开始使用MVVM模式和Caliburn.Micro框架开发WPF应用程序。我还添加了Caliburn.Micro.Contrib库,因为它包含一些有用的对话框 我试着在我的项目中使用它,但我无法让它工作。 当我单击应该显示对话框的按钮时,我看到一个空窗口,说明找不到视图:(Caliburn.Micro.Contrib.Dialogs.DialogViewModel`1[Caliburn.Micro.Contrib.Dialogs.Answer]) 我已设置Caliburn.Micro引导以嵌入CM Contrib程序集:C# 使用Caliburn.Micro.Contrib通用对话框,c#,.net,caliburn.micro,dialog,C#,.net,Caliburn.micro,Dialog,我对C#编程相当陌生。我开始使用MVVM模式和Caliburn.Micro框架开发WPF应用程序。我还添加了Caliburn.Micro.Contrib库,因为它包含一些有用的对话框 我试着在我的项目中使用它,但我无法让它工作。 当我单击应该显示对话框的按钮时,我看到一个空窗口,说明找不到视图:(Caliburn.Micro.Contrib.Dialogs.DialogViewModel`1[Caliburn.Micro.Contrib.Dialogs.Answer]) 我已设置Caliburn
protected override IEnumerable<Assembly> SelectAssemblies()
{
return base.SelectAssemblies().Concat(new Assembly[] { typeof(ResultExtensions).Assembly });
}
我再次检查了源代码,找到了问题的根源。它存在于
DialogResult
类型中,特别是IResult
的Execute
方法中,该方法将上下文参数传递给引起问题的WindowManager.ShowDialog()
我进一步查看了一下,发现库作者写了一篇关于对话框的文章,评论中的某篇文章与您的问题相同,建议的解决方案是在引导程序的Configure()
方法中调用以下代码行:
FrameworkExtensions.ViewLocator.EnableContextFallback();
这里是到的链接,这里是
如果这不起作用,我没有别的话要说,我已经尽力了。你能展示一下你的完整的引导程序吗?我已经编辑了我的帖子,但是我不认为这有什么特别之处。你的引导程序看起来很好,所以我不能告诉你可能有什么问题,但我可以建议Caliburn.Micro使用调试记录器(如中的调试记录器)记录它所做的一切,然后您将看到它无法定位该视图的原因,并从中继续。感谢提示,我已经激活了它,下面是我在日志中的内容:我理解您的意思,我刚刚尝试过(我已经尝试过了),但是运气不好,我遇到了同样的错误,事实上,CM试图找到完全相同的视图,当你更改DialogType类型时,它试图找到相应的视图。@Tarteens你所说的“当你更改DialogType类型时,它试图找到相应的视图”是什么意思,你能进一步解释一下吗?如果我设置DialogType。问题,在日志中,我有:未找到视图。搜索:Caliburn.Micro.Contrib.Dialogs.Dialog.Question。如果我设置了DialogType.Information,在日志中我有:View not found。搜索:Caliburn.Micro.Contrib.Dialogs.Dialog。Information@Tarteens我已经完全更改了答案,请检查编辑。感谢您的帮助,EnableContextFallback成功了。
public class NInjectBootstrapper<TRootModel> : Bootstrapper<TRootModel>
{
protected IKernel Kernel { get; private set; }
/// <summary>
/// The base type required for a view model
/// </summary>
public Type ViewModelBaseType { get; set; }
protected override void Configure()
{
// allow base classes to change bootstrapper settings
ConfigureBootstrapper();
var loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies().ToList();
var loadedPaths = loadedAssemblies.Select(a => a.Location).ToArray();
var referencedPaths = Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory, "*.dll");
var toLoad = referencedPaths.Where(r =>r.Contains("TxS.") && !loadedPaths.Contains(r, StringComparer.InvariantCultureIgnoreCase)).ToList();
toLoad.ForEach(path => loadedAssemblies.Add(AppDomain.CurrentDomain.Load(AssemblyName.GetAssemblyName(path))));
Bootstrapper.With.Ninject().Start();
Kernel = Bootstrapper.Container as IKernel;
//ViewLocator.AddNamespaceMapping("Caliburn.Micro.Contrib.Dialogs", "TxSGUI.Views");
}
protected override object GetInstance(System.Type service, string key)
{
object instance;
if (string.IsNullOrWhiteSpace(key))
{
instance = Kernel.TryGet(service);
}
else
{
instance = Kernel.TryGet(service, key);
}
if(instance == null)
throw new Exception(string.Format("Could not locate any instances of contract {0}", key ?? service.Name));
return instance;
}
protected override IEnumerable<object> GetAllInstances(System.Type service)
{
return Kernel.GetAll(service);
}
protected override void BuildUp(object instance)
{
Kernel.Inject(instance);
}
protected virtual void ConfigureBootstrapper()
{
// the default view model base type
ViewModelBaseType = typeof(System.ComponentModel.INotifyPropertyChanged);
}
protected override IEnumerable<Assembly> SelectAssemblies()
{
return base.SelectAssemblies().Concat(new Assembly[] { typeof(ResultExtensions).Assembly });
}
/// <summary>
/// Override to include your own Autofac configuration after the framework has finished its configuration, but
/// before the container is created.
/// </summary>
/// <param name="builder">The Autofac configuration builder.</param>
protected virtual void ConfigureContainer(IKernel builder)
{
}
}
public class TxSGuiModule : NinjectModule
{
public override void Load()
{
// Bind Window Manager
Kernel.Bind<IWindowManager>().To<WindowManager>().InSingletonScope();
// Bind Event Aggregator
Kernel.Bind<IEventAggregator>().To<EventAggregator>().InSingletonScope();
// Bind Main View
Kernel.Bind<TxSMainViewModel>().To<TxSMainViewModel>().InSingletonScope().Named(typeof(TxSMainViewModel).Name);
// Bind Views
Kernel.Bind(x => x.FromThisAssembly()
.SelectAllClasses().InheritedFrom<IShell>()
.Where(t => t.Name.EndsWith("ViewModel") && t.Namespace.StartsWith("TxSGUI"))
.BindSelection((a, c) =>
{
IList<Type> list = new List<Type>();
list.Add(typeof(IShell));
list.Add(a);
return list;
})
.Configure(b => b.InTransientScope()));
// Bind Actions
Kernel.Bind(x => x.FromThisAssembly().SelectAllClasses().InheritedFrom<IAction>().BindAllInterfaces().Configure(b => b.InSingletonScope()));
}
}
07/31/2013 14:46:21 - INFO - [Coroutine] - Executing coroutine.
07/31/2013 14:46:21 - WARN - [ViewLocator] - View not found. Searched: Caliburn.Micro.Contrib.Dialogs.Dialog.Question.
07/31/2013 14:46:21 - INFO - [ViewModelBinder] - Binding System.Windows.Window: Cannot find view for Caliburn.Micro.Contrib.Dialogs.DialogViewModel`1[Caliburn.Micro.Contrib.Dialogs.Answer]. and Caliburn.Micro.Contrib.Dialogs.DialogViewModel`1[Caliburn.Micro.Contrib.Dialogs.Answer].
07/31/2013 14:46:21 - INFO - [Action] - Setting DC of System.Windows.Window: Cannot find view for Caliburn.Micro.Contrib.Dialogs.DialogViewModel`1[Caliburn.Micro.Contrib.Dialogs.Answer]. to Caliburn.Micro.Contrib.Dialogs.DialogViewModel`1[Caliburn.Micro.Contrib.Dialogs.Answer].
07/31/2013 14:46:21 - INFO - [Action] - Attaching message handler Caliburn.Micro.Contrib.Dialogs.DialogViewModel`1[Caliburn.Micro.Contrib.Dialogs.Answer] to System.Windows.Window: Cannot find view for Caliburn.Micro.Contrib.Dialogs.DialogViewModel`1[Caliburn.Micro.Contrib.Dialogs.Answer]..
07/31/2013 14:46:21 - INFO - [ViewModelBinder] - Attaching System.Windows.Window: Cannot find view for Caliburn.Micro.Contrib.Dialogs.DialogViewModel`1[Caliburn.Micro.Contrib.Dialogs.Answer]. to Caliburn.Micro.Contrib.Dialogs.DialogViewModel`1[Caliburn.Micro.Contrib.Dialogs.Answer].
FrameworkExtensions.ViewLocator.EnableContextFallback();