2013-07-26 3 views
0

Я пытаюсь найти способы корректного отображения модальных диалогов на основе окон (т. Е. Они охватывают существующую часть окна и отображаются поверх этого содержимого модальным способом - покрытая часть Недоступно). Приложение построено в .net 4.5 поверх оболочки caliburn.micro 1.5.2 и использует MefBootstrapper (на основе http://caliburnmicro.codeplex.com/wikipage?title=Customizing%20The%20Bootstrapper).ModalContentPresenter с Caliburn.Micro

Простые решения (перекрывающиеся элементы управления в стеке 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, или у вас есть лучшее решение?

+0

Вы проверили образец приложения HelloScreens, который является частью [Экраны, проводники и композиция] (https://caliburnmicro.codeplex.com/wikipage?title=Screens%2c%20Conductors%20and%20Composition&referringTitle=Documentation) в документации. Автор реализовал это красиво, и насколько я могу сказать, он работает с навигацией и фокусировкой. –

+0

Экраны/проводники и т. Д. Допускаются для случаев, когда в каждый момент времени (из этого конкретного стека) просматривается только один экран. Это контрастирует с моим случаем, когда я хочу, чтобы исходный экран все еще был видимым, пока отображается модальный диалог (исходный экран немного затемнен, пока отображается модальное диалоговое окно). Таким образом, я не вижу полезного примера приложения. Да, они полезны для части «показать текущий экран» и «показать последний модальный диалог», но не для «одновременного отображения текущего экрана и модального диалога в одном месте». – alik

ответ

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 как-то понятно, FindNamedDescendants текущего Caliburn.Micro (названную как часть GetNamedElements FUNC, который Sniffer указал мне). В результате этого нельзя было обработать ModalContentPresenter таким образом, но его свойство Content и ModalContent может; поэтому тест снова соответствует типу ContentPresenter.

Смежные вопросы