26

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

4

4 回答 4

26

如果我对您的信息的解释是正确的,那么您需要的东西类似于 比利霍利斯在他的 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>

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

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

希望这可以帮助!

于 2008-10-06T10:05:15.563 回答
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 友好的方式使用。
于 2012-06-30T20:29:32.217 回答
2

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

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

于 2010-11-12T10:43:19.520 回答
1

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

我不太确定您是否理解模态对话框的含义?

于 2008-10-06T09:42:43.330 回答