У меня есть окно WPF, которое имеет среди других элементов управления узел Frame. В этом фрейме я показываю разные страницы. Есть ли способ сделать диалог модальным только для одной страницы? Когда я показываю диалог, не следует нажимать на какой-либо элемент управления на странице, но нужно иметь возможность щелкнуть элемент управления в том же окне, которое отсутствует на странице.
Как сделать модальный диалог для страницы в моем WPF-приложении?
Ответ 1
Если я правильно интерпретирую ваше сообщение, вам нужно что-то похожее на то, что Билли Холлис демонстрирует в своем приложении StaffLynx.
Недавно я создал аналогичный элемент управления, и оказалось, что такого рода идею относительно просто реализовать в WPF. Я создал настраиваемый элемент управления DialogPresenter. В шаблоне управления для настраиваемого элемента управления я добавил разметку, подобную следующей:
<ControlTemplate TargetType="{x:Type local=DialogPresenter}">
<Grid>
<ContentControl>
<ContentPresenter />
</ContentControl>
<!-- The Rectangle is what simulates the modality -->
<Rectangle x:Name="Overlay" Visibility="Collapsed" Opacity="0.4" Fill="LightGrey" />
<Grid x:Name="Dialog" Visibility="Collapsed">
<!-- The template for the dialog goes here (borders and such...) -->
<ContentPresenter x:Name="PART_DialogView" />
</Grid>
</Grid>
<ControlTemplate.Triggers>
<!-- Triggers to change the visibility of the PART_DialogView and Overlay -->
</ControlTemplate.Triggers>
</ControlTemplate>
Я также добавил метод Show(Control view)
, который находит "PART_DialogView" и добавляет переданный в представление свойство Content
.
Это позволяет мне использовать DialogPresenter
следующим образом:
<controls:DialogPresenter x:Name="DialogPresenter">
<!-- Normal parent view content here -->
<TextBlock>Hello World</TextBlock>
<Button>Click Me!</Button>
</controls:DialogPresenter>
Для обработчика событий кнопок (или связанной команды) я просто вызываю метод Show() для DialogPresenter
.
Вы также можете легко добавить разметку ScaleTransform к шаблону DialogPresenter, чтобы получить эффекты масштабирования, показанные в видео. Это решение имеет аккуратный и аккуратный пользовательский код управления и очень простой интерфейс для вашей команды программирования пользовательского интерфейса.
Надеюсь, это поможет!
Ответ 2
У меня есть проект github, который является настраиваемым FrameworkElement
, который позволяет отображать модальное содержимое по основному контенту.
Элемент управления можно использовать следующим образом:
<c:ModalContentPresenter IsModal="{Binding DialogIsVisible}">
<TabControl Margin="5">
<Button Margin="55"
Padding="10"
Command="{Binding ShowModalContentCommand}">
This is the primary Content
</Button>
</TabItem>
</TabControl>
<c:ModalContentPresenter.ModalContent>
<Button Margin="75"
Padding="50"
Command="{Binding HideModalContentCommand}">
This is the modal content
</Button>
</c:ModalContentPresenter.ModalContent>
</c:ModalContentPresenter>
Особенности:
- Отображает произвольный контент.
- Не отключает основной контент, пока отображается модальный контент.
- Отключает доступ мыши и клавиатуры к основному контенту, пока отображается модальное содержимое.
- Только модальный контент, который он охватывает, а не все приложение.
- может использоваться в дружественном MVVM способе путем привязки к свойству
IsModal
.
Ответ 3
Почему бы просто не использовать вложенные насосы сообщений для создания модальных элементов управления.
http://deanchalk.com/wpf-modal-controls-via-dispatcherframe-nested-message-pumps/
Ответ 4
Вы не ищете модальный диалог здесь. Вам понадобится функция, которая отключит элемент управления "страница", покажет диалог и снова включит его, когда диалог закроется.
Я не слишком уверен, понимаете ли вы, что означает модальный диалог?