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一起工作,或者你有更好的解决方案吗?
以下代码将起作用。这是在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类型的。