2011-06-23 13 views

Respuesta

26

Aquí es an example:

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; 
} 
+0

¿Es lo mismo que la aplicación Windows Form? –

+0

Tendrá que usar 'System.Windows.MessageBox'. [Aquí está la documentación de 'MessageBox.Show'] (http://msdn.microsoft.com/en-us/library/ms598703.aspx) en el ejemplo, parte del ensamblado PresentationFramework. – rid

4

Tenga en cuenta que si bien la respuesta de Radu funciona, no se puede aplicar estilos de WPF para el cuadro de mensaje.

Tomé un enfoque diferente para este problema.

Creé una clase para servir como un modelo de vista para la ventana de mi mensaje y creé un estilo sobre cómo quería que mi ventana apareciera. Más tarde, en el código, creé una nueva ventana, configuré DataContext en una instancia de mi modelo de vista y configuré la propiedad Style de la ventana con el estilo que creé para la ventana.

Sé que suena un poco exagerado, y no estoy seguro de cómo otras personas solucionan este mismo problema ... pero mi solución es bastante flexible y realmente me está gustando.

Por ejemplo, aquí está diálogo Ver Modelo:

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 

Aquí es mi estilo para una ventana básica "mensaje":

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

Mi CustomDialogWindow es simplemente una ventana sin nada en él:

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

Y en el CustomDialogWindow Tengo el siguiente código para que la ventana se cierra cuando el usuario hace clic cancelar o bien:

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 

Ahora cuando tengo que utilizar la ventana que acaba de crear una instancia de un nuevo CustomDialogWindow, establecer que es DataContext a una nueva instancia de la clase DialogViewModel, y estableció su estilo a la "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 

la razón por la que me gusta este enfoque se debe a que heredan de la MyDialogViewModel y proporcionar más propiedades de manera que, por ejemplo, yo puede mostrar un montón de opciones para que el usuario pueda elegir. Solo proporciono estilos personalizados para cada tipo de ventana que quiero mostrar (asegurándome de enlazar las propiedades apropiadas). Como dije, es muy flexible y bastante fácil de implementar.

¡Salud!

-Frinny

Cuestiones relacionadas