Как мне создать модальный диалог для Страницы в моем WPF-приложении?

StackOverflow https://stackoverflow.com/questions/173652

  •  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 собственность.

Почему бы просто не использовать вложенные насосы сообщений для создания модальных элементов управления

http://deanchalk.com/wpf-modal -через-элементы управления-dispatcherframe-вложенная-сообщение насосы /

Вы не ищете модальный диалог здесь. Вам нужна функция, которая отключит " страницу " контролировать, показывать диалоговое окно и повторно включать его после закрытия диалогового окна.

Я не совсем уверен, понимаете ли вы, что должен делать модальный диалог?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top