Pergunta

Alguém pode pensar em uma boa explicação para o fato de que o resultado de uma caixa de diálogo é um bool anulável no WPF? Isso sempre me confundiu. Em Winforms, era um tipo de enumeração e isso fazia muito mais sentido para mim.

Foi útil?

Solução

Na minha opinião, isso foi feito porque na maioria dos casos você não precisa do Especializado generalizado opções como tentar novamente ou ignorar.

Se você precisar de mais do que OK/Cancelar, deve usar algum tipo de diálogo de tarefas, por exemplo, com respostas escritas. Dessa forma, você não está limitado aos poucos valores de enum em que alguém pensou em algumas décadas atrás, e o dialogresult é apenas positivo/negativo para uso básico e você pode implementar sua própria propriedade específica para suas necessidades avançadas. Portanto, apenas é necessário/falso, e nulo indicando que a janela ainda não foi fechada (nenhum valor foi atribuído à propriedade ainda).

Se você possui uma caixa de diálogo que é mais do que apenas uma pergunta que o usuário deve responder (por exemplo, um formulário de entrada), normalmente você está melhor com OK/Cancelar, para não precisar de mais valores.

Outras dicas

o DialogResult A propriedade é definida no Window classe. De jeito nenhum WindowS são diálogos. Portanto, a propriedade não é relevante para todas as janelas. UMA Window que foi mostrado via Show() ao invés de ShowDialog() será (presumivelmente, a menos que você o defina por algum motivo) DialogResult = null.

Aqui está um exemplo simples para demonstrar:

Window1.xaml:

<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <StackPanel>
        <Button Name="b1">Show</Button>
        <Button Name="b2">ShowDialog</Button>
    </StackPanel>
</Window>

Window1.xaml.cs:

using System.Windows;

namespace WpfApplication1
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
            b1.Click += new RoutedEventHandler(b1_Click);
            b2.Click += new RoutedEventHandler(b2_Click);
        }

        void b1_Click(object sender, RoutedEventArgs e)
        {
            var w = new Window();
            w.Closed += delegate
            {
                MessageBox.Show("" + w.DialogResult);
            };

            w.Show();
        }

        void b2_Click(object sender, RoutedEventArgs e)
        {
            var w = new Window();
            w.ShowDialog();
            MessageBox.Show("" + w.DialogResult);
        }
    }
}

Quando você fecha as janelas, você notará que a caixa de diálogo tem um DialogResult do false, enquanto o não dialog tem um null DialogResult.

De acordo com A documentação do MSDN:

O DIACIDRESULT é nulo quando a caixa de diálogo é mostrada, mas não aceita nem cancelada.

Mas não tenho certeza de como isso pode acontecer, a menos que você esteja lidando com vários threads acessando a caixa de diálogo.

A documentação diz ser falsa quando uma das seguintes coisas acontece:

  • Pressesalt+F4.
  • Clique no botão Fechar.
  • Seleciona fecha no menu do sistema.

O showDialog sempre retornará verdadeiro ou falso. O DIACIONGRESULT SOMENTE TOLAR SOBRE O ESTADO NULL quando a caixa de diálogo estiver aberta. A transição de NULL para TRUE ou FALSE fechará a caixa de diálogo e fará a chamada original para mostrar o retorno.

IMO isso ocorre porque o dialogresult nem sempre é usado. Veja bem, você só pode definir o DialogResult se a janela for chamada pelo método ShowDialog (), se você chamá -lo com o método show () e tentar definir o DIALOGRESULT para qualquer coisa, ele lançará um invalidoperationException. Então eu acho que é por isso que é anulável, caso você ligue para a janela com o método show (), será nulo, se você chamá -lo usando o showDialog (), depende de você.

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