Jak utworzyć DialogBox, aby monitować użytkownika o opcję Tak/Nie w WPF


Wiem, jak to zrobić w aplikacji Windows Form, ale nadal nie mogłem znaleźć sposobu, aby to zrobić w aplikacji WPF.
Jak przedstawiłbym użytkownikowi blokujący DialogBox z opcją Tak/Nie i odebrał/przetworzył odpowiedź od użytkownika?
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Tutaj

przykład
http://dotnetbhupesh.com/post/ ... .aspx
:
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;
}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Zauważ, że chociaż odpowiedź Radu działa, nie możesz zastosować stylów WPF do MessageBox.
Miałem inne podejście do tego problemu.
Stworzyłem klasę, która służyłaby jako model widoku dla mojej skrzynki wiadomości i stworzyłem styl odpowiadający mojemu oknu. W dalszej części kodu utworzyłem wystąpienie nowego okna, ustawiłem jego DataContext na wystąpienie mojego modelu widoku i ustawiłem właściwość stylu okna na styl, który utworzyłem dla okna.
Wiem, że brzmi to trochę przesadnie i nie jestem pewien, jak inni ludzie rozwiązują ten sam problem ... ale moje rozwiązanie jest dość elastyczne i zaczyna mi się naprawdę podobać.
Na przykład, oto model widoku okna dialogowego:
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

Oto mój styl podstawowego okna wiadomości:
<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>

Moje CustomDialogWindow to tylko okno, w którym nic nie ma:
(XAML)
<Window x:Class="CustomDialogWindow"
xmlns="[url=http://schemas.microsoft.com/winfx/2006/xaml/presentation"]http://schemas.microsoft.com/w ... ot%3B[/url]
xmlns:x="[url=http://schemas.microsoft.com/winfx/2006/xaml"]http://schemas.microsoft.com/winfx/2006/xaml"[/url]
Title="CustomDialogWindow"
SizeToContent="WidthAndHeight"></Window>

A w CustomDialogWindow mam następujący kod, dzięki czemu okno jest zamykane, gdy użytkownik kliknie przycisk Anuluj lub OK:
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

Teraz, kiedy muszę użyć okna, po prostu tworzę nową instancję CustomDialogWindow, ustawiam jej DataContext na nowe wystąpienie klasy DialogViewModel i ustawiam jej styl na „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

Powodem, dla którego podoba mi się to podejście, jest to, że dziedziczę po MyDialogViewModel i udostępniam więcej właściwości, aby na przykład wyświetlić kilka opcji do wyboru przez użytkownika. Po prostu podaję niestandardowe style dla każdego typu okna, które chcę wyświetlić (pamiętaj, aby powiązać odpowiednie właściwości). Jak powiedziałem, jest bardzo elastyczny i dość łatwy do wdrożenia.
Hurra!
- Frynnie

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się