Как мне создать модальный диалог для Страницы в моем WPF-приложении?
-
05-07-2019 - |
Вопрос
У меня есть окно WPF, в котором среди прочих элементов управления находится Фрейм.В этом фрейме я показываю разные страницы.Есть ли способ сделать диалоговое окно модальным только для страницы?Когда я показываю диалоговое окно, должно быть невозможно щелкнуть по какому-либо элементу управления на странице, но должна быть возможность щелкнуть по элементу управления в том же окне, которого нет на странице.
Решение
Если я правильно интерпретирую ваше сообщение, вам нужно что-то, что работает аналогично Билли Холлис демонстрирует в своем приложении 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, чтобы получить эффекты масштабирования, показанные в видео. Это решение имеет аккуратный и понятный пользовательский управляющий код и очень простой интерфейс для вашей команды программистов пользовательского интерфейса.
Надеюсь, это поможет!
Другие советы
У меня есть проект по гитхаб это обычай 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
собственность.
Почему бы просто не использовать вложенные насосы сообщений для создания модальных элементов управления
Вы не ищете модальный диалог здесь. Вам нужна функция, которая отключит " страницу " контролировать, показывать диалоговое окно и повторно включать его после закрытия диалогового окна.
Я не совсем уверен, понимаете ли вы, что должен делать модальный диалог?