Подтвердить что ты не робот

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

У меня есть окно WPF, которое имеет среди других элементов управления узел Frame. В этом фрейме я показываю разные страницы. Есть ли способ сделать диалог модальным только для одной страницы? Когда я показываю диалог, не следует нажимать на какой-либо элемент управления на странице, но нужно иметь возможность щелкнуть элемент управления в том же окне, которое отсутствует на странице.

4b9b3361

Ответ 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.

Ответ 4

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

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