ModalContentPresenter with Caliburn.Micro

本文关键字:Micro Caliburn with ModalContentPresenter | 更新日期: 2023-09-27 18:25:09

我正试图找到正确显示非基于窗口的模态对话框的方法(即,它们覆盖了窗口的现有部分,并以模态方式显示在内容的顶部-覆盖的部分是不可访问的)。该应用程序内置于.net 4.5中caliburn.micro框架1.5.2之上,并使用MefBootstrapper(基于http://caliburnmicro.codeplex.com/wikipage?title=Customizing%20The%20Bootstrapper)。

简单的解决方案(xaml堆栈中的重叠控件)并不能涵盖所有问题,比如键盘焦点和导航。

我发现了ModalContentPresenter类,它派生自FrameworkElement,并在http://programmingwithpassion.wordpress.com/2012/07/01/displaying-modal-content-in-wpf/它似乎处理了模态对话框的大多数可能问题。

遗憾的是,该窗口没有显示任何内容。根据我的研究,代码约定似乎不适用于定义为ModalContentPresenter子级的控件。不幸的是,我未能在caliburn.micro源代码和/或文档中找到合适的位置。

示例(没有ModelContentPresenter,正在工作):

<Window>
    <TextBlock x:Name="SomeName"/>
</Window>

示例(使用ModelContentPresenter,不工作):

<Window>
    <c:ModelContentPresenter isModal="False">
        <TextBlock x:Name="SomeName"/>
    </c:ModelContentPresenter>
</Window>

我需要做些什么才能让代码约定与ModelContentPresenter一起工作,或者你有更好的解决方案吗?

ModalContentPresenter with Caliburn.Micro

以下代码将起作用。这是在http://caliburnmicro.codeplex.com/discussions/432271.

        BindingScope.AddChildResolver(
            type => type == typeof(System.Windows.Controls.ContentPresenter),
            control =>
            {
                var result = new List<DependencyObject>();
                var typedControl = control as System.Windows.Controls.ContentPresenter;
                if (typedControl != null)
                {
                    if (typedControl.Content is DependencyObject)
                    {
                        result.Add(typedControl.Content as DependencyObject);
                    }
                }
                return result;
            });

注:ModalContentPresenter在某种程度上被当前Caliburn.Micro的FindNamedDescendants(称为GetNamedElements函数的一部分,Sniffer指出了这一点)所理解。因此,ModalContentPresenter不能通过这种方式咳嗽,但其Content和ModalContent属性可以;这就是为什么测试是针对ContentPresenter类型的。