【问题标题】:ModalContentPresenter with Caliburn.Micro带有 Caliburn.Micro 的 ModalContentPresenter
【发布时间】:2013-07-29 18:53:39
【问题描述】:

我正在尝试找到正确显示非基于窗口的模式对话框的方法(即它们覆盖窗口的现有部分并以模式方式显示在该内容的顶部 - 覆盖的部分不可访问)。该应用程序构建在 caliburn.micro 框架 1.5.2 之上的 .net 4.5 中,并使用 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 一起使用,或者您有更好的解决方案吗?

【问题讨论】:

  • 您是否检查过名为 HelloScreens 的示例应用程序,它是文档中 Screens, Conductors and Composition 的一部分。作者以很好的方式实现了这一点,据我所知,它适用于导航和焦点。
  • 屏幕/导体等适用于每次仅访问一个屏幕(来自该特定堆栈)的情况。这与我的情况形成鲜明对比,当我希望在显示模式对话框时原始屏幕仍然可见(只要显示模式对话框,原始屏幕就会稍微变暗)。因此,我认为示例应用程序没有用。是的,它们对于“显示当前屏幕”和“显示最近的模态对话框”部分很有用,但对于“在同一个地方同时显示当前屏幕和模态对话框”则不适用。

标签: c# wpf modal-dialog caliburn.micro c#-5.0


【解决方案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 类型的。

【讨论】:

    猜你喜欢
    • 2018-02-15
    • 2017-10-02
    • 1970-01-01
    • 2013-01-15
    • 1970-01-01
    • 1970-01-01
    • 2015-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多