0

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

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

我找到了从 FrameworkElement 派生的 ModalContentPresenter 类,并在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 一起使用,或者您有更好的解决方案吗?

4

1 回答 1

1

以下代码将起作用。它是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 类型的。

于 2013-07-29T10:53:39.753 回答