Pergunta

Eu tenho uma janela WPF que tem um entre outros anfitriões controla um Frame. Nesse quadro I exibir páginas diferentes. Existe maneira de fazer um modal diálogo para apenas uma página? Quando eu estou mostrando o diálogo não deve ser possível clicar em qualquer controle na página, mas deve ser possível clicar em um controle na mesma janela que não está na página.

Foi útil?

Solução

Se eu estou correto na interpretação de sua mensagem, você quer algo que funciona de forma semelhante ao que Billy Hollis demonstra no seu pedido StaffLynx .

Eu recentemente construído um controle semelhante e verifica-se que este tipo de idéia é relativamente simples de implementar no WPF. Eu criei um controle personalizado chamado DialogPresenter. No modelo de controle para o controle personalizado, adicionei marcação semelhante ao seguinte:

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

Eu também adicionei um método Show(Control view), que encontra o do 'PART_DialogView', e acrescenta o passado em vista a propriedade Content.

Isso, então, permite-me a usar o DialogPresenter da seguinte forma:

<controls:DialogPresenter x:Name="DialogPresenter">
  <!-- Normal parent view content here -->
  <TextBlock>Hello World</TextBlock>
  <Button>Click Me!</Button>
</controls:DialogPresenter>

Para o manipulador de botões evento (ou comando ligado), eu simplesmente chamar o método Show () do DialogPresenter.

Você também pode adicionar facilmente marcação ScaleTransform ao modelo DialogPresenter para obter efeitos mostrados no vídeo escala. Esta solução tem código de controle personalizado limpo e arrumado, e uma interface muito simples para sua equipe de programação de interface do usuário.

Espero que isso ajude!

Outras dicas

Eu tenho um projeto em github que é um FrameworkElement personalizado que permite que você exibir o conteúdo modal mais o conteúdo principal.

O controle pode ser usado como este:

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

características:

  • Exibe conteúdo arbitrário.
  • não desabilita o conteúdo principal, enquanto o conteúdo modal está sendo exibido.
  • Disables do mouse e acesso teclado para o conteúdo principal, enquanto o conteúdo modal é exibido.
  • Só é modal para o conteúdo que está cobrindo, não todo o aplicativo.
  • pode ser usado de uma forma amigável MVVM ligando-se a propriedade IsModal.

Por que não usar mensagem aninhada bombas para criar controles modais

http://deanchalk.com/wpf-modal -Controla-via-dispatcherframe-nested-mensagem-bombas /

Você não está procurando um diálogo modal aqui. Você precisa de uma função que irá desativar o controle "página", mostram um diálogo e reativá-lo quando a janela fecha.

Eu não estou muito certo se você entender o que um diálogo modal pretende fazer ainda?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top