如何在WPF应用程序中为页面创建模态对话框?

时间:2008-10-06 09:17:42

标签: wpf modal-dialog

我有一个WPF窗口,其中有一个控件主机一个帧。在那个框架中,我显示不同的页面。有没有办法只对一个页面进行对话模式?当我显示对话框时,不应该单击页面上的任何控件,但应该可以单击页面上不在同一窗口上的控件。

4 个答案:

答案 0 :(得分:25)

如果我在解释您的信息时是正确的,那么您需要的内容类似于什么 Billy Hollis demonstrates in his StaffLynx application

我最近构建了一个类似的控件,结果发现这种想法在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>

对于按钮事件处理程序(或绑定命令),我只需调用DialogPresenter的Show()方法。

您还可以轻松地将ScaleTransform标记添加到DialogPresenter模板,以获得视频中显示的缩放效果。该解决方案具有干净整洁的自定义控制代码,并为您的UI编程团队提供了一个非常简单的界面。

希望这有帮助!

答案 1 :(得分:4)

我在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>

特点:

  • 显示任意内容。
  • 在显示模态内容时不禁用主要内容。
  • 在显示模态内容时禁用对主要内容的鼠标和键盘访问。
  • 仅对其所涵盖的内容进行模态处理,而不是整个应用程序。
  • 可以通过绑定到IsModal属性以MVVM友好的方式使用。

答案 2 :(得分:2)

为什么不使用嵌套的消息泵来创建模态控件

http://deanchalk.com/wpf-modal-controls-via-dispatcherframe-nested-message-pumps/

答案 3 :(得分:1)

您不是在寻找模态对话框。您需要一个能够禁用“页面”控件,显示对话框并在对话框关闭时重新启用它的功能。

我不太清楚你是否理解模态对话的意思是什么?