C# 使用Caliburn.Micro.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

我对C#编程相当陌生。我开始使用MVVM模式和Caliburn.Micro框架开发WPF应用程序。我还添加了Caliburn.Micro.Contrib库,因为它包含一些有用的对话框

我试着在我的项目中使用它,但我无法让它工作。 当我单击应该显示对话框的按钮时,我看到一个空窗口,说明找不到视图:(Caliburn.Micro.Contrib.Dialogs.DialogViewModel`1[Caliburn.Micro.Contrib.Dialogs.Answer])

我已设置Caliburn.Micro引导以嵌入CM Contrib程序集:

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();