Как создать DialogBox, чтобы запросить у пользователя опцию Да / Нет в WPF - PullRequest
12 голосов
/ 23 июня 2011

Я знаю, как это сделать в приложении Windows Form, но я не смог найти этого в приложении WPF.Как бы я представил пользователю блокирующий DialogBox с параметром Да / Нет и получил / обработал ответ от пользователя?

Ответы [ 2 ]

30 голосов
/ 23 июня 2011

Вот пример :

string sMessageBoxText = "Do you want to continue?";
string sCaption = "My Test Application";

MessageBoxButton btnMessageBox = MessageBoxButton.YesNoCancel;
MessageBoxImage icnMessageBox = MessageBoxImage.Warning;

MessageBoxResult rsltMessageBox = MessageBox.Show(sMessageBoxText, sCaption, btnMessageBox, icnMessageBox);

switch (rsltMessageBox)
{
    case MessageBoxResult.Yes:
    /* ... */
    break;

    case MessageBoxResult.No:
    /* ... */
    break;

    case MessageBoxResult.Cancel:
    /* ... */
    break;
}
4 голосов
/ 23 июня 2011

Обратите внимание, что, хотя ответ Раду работает, вы не можете применять стили WPF к MessageBox.

Я использовал другой подход к этой проблеме.

Я создал класс, который будет служить представлениемМодель для моего окна сообщения, и я создал стиль для того, как я хотел, чтобы мое окно появилось.Позже в коде я создал новый Window, установил его DataContext для экземпляра моей модели представления и установил для свойства Style окна стиль, который я создал для окна.

Я знаю, это звучит немного излишне, иЯ не уверен, как другие люди решают эту же проблему ... но мое решение достаточно гибкое, и оно мне действительно нравится.

Например, вот модель Dialog View:

Public Class MyDialogViewModel
  Public Event Closed()

  Public Property Message As String

  Public Property Cancel As MyNamespace.RelayCommand
  Public Property Close As MyNamespace.RelayCommand
  Public Property WasCancelled As Boolean

  Public Sub New()
    WasCancelled = True
    Cancel = New MyNamespace.RelayCommand(AddressOf CancelClicked)
    Close = New MyNamespace.RelayCommand(AddressOf CloseClicked)
  End Sub

  Private Sub CancelClicked()
    RaiseEvent Closed()
  End Sub
  Private Sub CloseClicked()
    WasCancelled = False
    RaiseEvent Closed()
  End Sub
End Class

Вот мой стиль для основного окна «сообщения»:

    <Style x:Key="myMessageStyle" TargetType="{x:Type myNameSpace:CustomDialogWindow}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate>
                    <ControlTemplate.Resources>
                        <Style TargetType="{x:Type Button}" BasedOn="{StaticResource {x:Type Button}}">
                            <Setter Property="Width" Value="100"/>
                            <Setter Property="Height" Value="25"/>
                        </Style>
                    </ControlTemplate.Resources>
                    <Border >
                        <DockPanel Margin="10,10,0,10">
                            <TextBlock Text="{Binding Message}" Width="Auto" TextWrapping="WrapWithOverflow" DockPanel.Dock="Top" 
                                       Margin="10"
                                       Foreground="{StaticResource MyMessageBoxForegroundColor}"/>
                            <DockPanel Margin="5,0,0,0" DockPanel.Dock="Bottom">
                                <Button Content="Ok" Command="{Binding Close}" ></Button>
                                <Button Content="Cancel" Command="{Binding Cancel}"  HorizontalAlignment="Stretch"></Button>
                            </DockPanel>
                        </DockPanel>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

Мой CustomDialogWindow - это просто окно, в котором ничего нет:

(XAML)

<Window x:Class="CustomDialogWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="CustomDialogWindow"
        SizeToContent="WidthAndHeight">

</Window>

И в CustomDialogWindow у меня есть следующий код, чтобы окно закрывалось, когда пользователь нажимает кнопку «Отмена» или «ОК»:

Public Class CustomDialogWindow 

    Private Sub CustomDialogWindow_DataContextChanged(ByVal sender As Object, ByVal e As System.Windows.DependencyPropertyChangedEventArgs) Handles Me.DataContextChanged
        Dim dContext As MyDialogViewModel= TryCast(DataContext, MyDialogViewModel)
        If dContext IsNot Nothing Then
            AddHandler DirectCast(DataContext, MyDialogViewModel).CloseWindow, AddressOf CloseWindow
        End If
    End Sub
    Private Sub CloseWindow()
        Me.Close()
    End Sub
End Class

Теперь, когда мне нужно использовать окно, я просто создаю экземплярnew CustomDialogWindow, установите его DataContext на новый экземпляр класса DialogViewModel и установите его стиль на «myMessageStyle»:

Dim cdw As New CustomDialogWindow
Dim dvm As New DialogViewModel
dvm.Message = "Hello World!"
cdw.DataContext = dvm
cdw.ShowDialog()

If dvm.WasCancelled = False Then 
  '....'
End If

Причина, по которой мне нравится этот подход, заключается в том, что я наследую отm MyDialogViewModel и предоставить больше свойств, чтобы, например, я мог отобразить несколько вариантов для выбора пользователя.Я просто предоставляю пользовательские стили для каждого типа окна, которое я хочу отобразить (убедитесь, что привязаны соответствующие свойства).Как я уже сказал, он очень гибкий и довольно простой в реализации.

Cheers!

-Frinny

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...