2016-07-11 16 views
0

カスタムWPF MessageBoxがあります。特定のメッセージキャプションが親ウィンドウのランダムな場所に表示されています。カスタムMessageBoxは次のようになります。カスタムWPFメッセージボックステキストが空です

public static class WPFMessageBox 
{ 
    public static MessageBoxResult Show(string messageBoxText) 
    { 
     return ShowCore(null, messageBoxText); 
    } 

    public static MessageBoxResult Show(string messageBoxText, string caption) 
    { 
     return ShowCore(null, messageBoxText, caption); 
    } 

    public static MessageBoxResult Show(Window owner, string messageBoxText) 
    { 
     return ShowCore(owner, messageBoxText); 
    } 

    public static MessageBoxResult Show(string messageBoxText, string caption, MessageBoxButton button) 
    { 
     return ShowCore(null, messageBoxText, caption, button); 
    } 

    public static MessageBoxResult Show(Window owner, string messageBoxText, string caption) 
    { 
     return ShowCore(owner, messageBoxText, caption); 
    } 

    public static MessageBoxResult Show(string messageBoxText, string caption, MessageBoxButton button, MessageBoxImage icon) 
    { 
     return ShowCore(null, messageBoxText, caption, button, icon); 
    } 

    public static MessageBoxResult Show(Window owner, string messageBoxText, string caption, MessageBoxButton button) 
    { 
     return ShowCore(owner, messageBoxText, caption, button); 
    } 

    public static MessageBoxResult Show(string messageBoxText, string caption, MessageBoxButton button, MessageBoxImage icon, MessageBoxResult defaultResult) 
    { 
     return ShowCore(null, messageBoxText, caption, button, icon, defaultResult); 
    } 

    public static MessageBoxResult Show(Window owner, string messageBoxText, string caption, MessageBoxButton button, MessageBoxImage icon) 
    { 
     return ShowCore(owner, messageBoxText, caption, button, icon); 
    } 

    public static MessageBoxResult Show(string messageBoxText, string caption, MessageBoxButton button, MessageBoxImage icon, MessageBoxResult defaultResult, MessageBoxOptions options) 
    { 
     return ShowCore(null, messageBoxText, caption, button, icon, defaultResult, options); 
    } 

    public static MessageBoxResult Show(Window owner, string messageBoxText, string caption, MessageBoxButton button, MessageBoxImage icon, MessageBoxResult defaultResult) 
    { 
     return ShowCore(owner, messageBoxText, caption, button, icon, defaultResult); 
    } 

    public static MessageBoxResult Show(Window owner, string messageBoxText, string caption, MessageBoxButton button, MessageBoxImage icon, MessageBoxResult defaultResult, MessageBoxOptions options) 
    { 
     return ShowCore(owner, messageBoxText, caption, button, icon, defaultResult, options); 
    } 

    private static MessageBoxResult ShowCore(
     Window owner, 
     string messageBoxText, 
     string caption = "", 
     MessageBoxButton button = MessageBoxButton.OK, 
     MessageBoxImage icon = MessageBoxImage.None, 
     MessageBoxResult defaultResult = MessageBoxResult.None, 
     MessageBoxOptions options = MessageBoxOptions.None) 
    { 
     if (caption == "specific message caption") 
     { 
      var maxHeight = owner.ActualHeight - 300; 
      var maxWidth = owner.ActualWidth - 500; 
      var randomHeight = GetRandomNumber(2, maxHeight); 
      var randomWidth = GetRandomNumber(2, maxWidth); 

      return WPFMessageBoxWindow.Show(
       delegate(Window messageBoxWindow) 
       { 
        messageBoxWindow.WindowStartupLocation = WindowStartupLocation.Manual; 
        messageBoxWindow.Left = randomWidth; 
        messageBoxWindow.Top = randomHeight; 
        messageBoxWindow.Owner = owner; 
       }, 
       messageBoxText, caption, button, icon, defaultResult, options); 
     } 

     return WPFMessageBoxWindow.Show(
      delegate(Window messageBoxWindow) 
      { 
       messageBoxWindow.Owner = owner; 
      }, 
      messageBoxText, caption, button, icon, defaultResult, options); 
    } 

    private static double GetRandomNumber(double minimum, double maximum) 
    { 
     Random random = new Random(); 
     return random.NextDouble() * (maximum - minimum) + minimum; 
    } 
} 

WPFメッセージボックスウィンドウは次のようになります。

public partial class WPFMessageBoxWindow : Window 
{ 
    public WPFMessageBoxWindow() 
    { 
     InitializeComponent(); 
    } 

    private MessageBoxViewModel _viewModel; 

    public static MessageBoxResult Show(
     Action<Window> setOwner, 
     string messageBoxText, 
     string caption, 
     MessageBoxButton button, 
     MessageBoxImage icon, 
     MessageBoxResult defaultResult, 
     MessageBoxOptions options) 
    { 
     if ((options & MessageBoxOptions.DefaultDesktopOnly) == MessageBoxOptions.DefaultDesktopOnly) 
     { 
      throw new NotImplementedException(); 
     } 

     if ((options & MessageBoxOptions.ServiceNotification) == MessageBoxOptions.ServiceNotification) 
     { 
      throw new NotImplementedException(); 
     } 

     _messageBoxWindow = new WPFMessageBoxWindow() 
     { 
      ShowInTaskbar = false, 
      Topmost = true, 
      ResizeMode = ResizeMode.NoResize 
     }; 

     setOwner(_messageBoxWindow); 

     PlayMessageBeep(icon); 

     _messageBoxWindow._viewModel = new MessageBoxViewModel(_messageBoxWindow, caption, messageBoxText, button, icon, defaultResult, options); 
     _messageBoxWindow.DataContext = _messageBoxWindow._viewModel; 
     _messageBoxWindow.ShowDialog(); 
     return _messageBoxWindow._viewModel.Result; 
    } 

    private static void PlayMessageBeep(MessageBoxImage icon) 
    { 
     switch (icon) 
     { 
      //case MessageBoxImage.Hand: 
      //case MessageBoxImage.Stop: 
      case MessageBoxImage.Error: 
       SystemSounds.Hand.Play(); 
       break; 

      //case MessageBoxImage.Exclamation: 
      case MessageBoxImage.Warning: 
       SystemSounds.Exclamation.Play(); 
       break; 

      case MessageBoxImage.Question: 
       SystemSounds.Question.Play(); 
       break; 

      //case MessageBoxImage.Asterisk: 
      case MessageBoxImage.Information: 
       SystemSounds.Asterisk.Play(); 
       break; 

      default: 
       SystemSounds.Beep.Play(); 
       break; 
     } 
    } 

    [ThreadStatic] 
    private static WPFMessageBoxWindow _messageBoxWindow; 

    protected override void OnSourceInitialized(EventArgs e) 
    { 
     // removes the application icon from the window top left corner 
     // this is different than just hiding it 
     WindowHelper.RemoveIcon(this); 

     switch (_viewModel.Options) 
     { 
      case MessageBoxOptions.None: 
       break; 

      case MessageBoxOptions.RightAlign: 
       WindowHelper.SetRightAligned(this); 
       break; 

      case MessageBoxOptions.RtlReading: 
       break; 

      case MessageBoxOptions.RightAlign | MessageBoxOptions.RtlReading: 
       break; 
     } 

     // disable close button if needed and remove resize menu items from the window system menu 
     var systemMenuHelper = new SystemMenuHelper(this); 

     if (_viewModel.ButtonOption == MessageBoxButton.YesNo) 
     { 
      systemMenuHelper.DisableCloseButton = true; 
     } 

     systemMenuHelper.RemoveResizeMenu = true; 
    } 

    private void Window_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.Key == Key.Escape) 
     { 
      _viewModel.EscapeCommand.Execute(null); 
     } 
    } 

    protected override void OnClosed(EventArgs e) 
    { 
     base.OnClosed(e); 
     _viewModel.CloseCommand.Execute(null); 
    } 
} 

私はコードの私の特定のキャプションのためのメッセージボックスを使用してこの方法:

dynamic parentWindow = Window.GetWindow(this); 
var result = WPFMessageBox.Show(parentWindow, "message text", "specific message cation", 
MessageBoxButton.YesNo, MessageBoxImage.Question); 

私の問題は、この特定のメッセージのためだけに、MessageBoxのテキストが空になっていることです。

ここ

empty text

XAMLです:

<Window 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:MessageBoxUtils" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" x:Class="MessageBoxUtils.WPFMessageBoxWindow" 
    Title="{Binding Title}" ResizeMode="NoResize" FlowDirection="{Binding TitleFlowDirection}" 
    ShowInTaskbar="False" WindowStartupLocation="CenterScreen" SizeToContent="Height" KeyDown="Window_KeyDown" Width="500" d:DesignWidth="500" Height="300"> 
<Grid> 

    <Grid FlowDirection="{Binding ContentFlowDirection}"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="60" /> 
      <RowDefinition Height="2" /> 
      <RowDefinition Height="*" /> 
      <RowDefinition Height="90" /> 
     </Grid.RowDefinitions> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="60" /> 
      <ColumnDefinition Width="*" /> 
     </Grid.ColumnDefinitions> 

     <Image Source="{Binding MessageImageSource}" HorizontalAlignment="Left" VerticalAlignment="Center" Height="32" Width="32" Margin="10 0 0 0" /> 

     <TextBlock FontSize="28" Text="{Binding Message}" Grid.RowSpan="3" Grid.Column="1" TextWrapping="Wrap" TextAlignment="Left" HorizontalAlignment="{Binding ContentTextAlignment}" VerticalAlignment="Top" Margin="10,10,10,0" /> 

     <Border Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="2" Background="#FFE6E6E6" BorderThickness="0 1 0 0" BorderBrush="#FFDFDFDF"> 
      <StackPanel Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Right" Margin="0,18,10,10" Height="63" > 
       <Button FontSize="25" Content="_Yes" Visibility="{Binding YesNoVisibility}" Command="{Binding YesCommand}" IsDefault="{Binding IsYesDefault}" Margin="5 5 5 5" Height="42" Width="80" /> 
       <Button FontSize="25" Content="_No" Visibility="{Binding YesNoVisibility}" Command="{Binding NoCommand}" IsDefault="{Binding IsNoDefault}" Margin="5 5 5 5" Height="42" Width="80" /> 
       <Button FontSize="25" Content="O_K" Visibility="{Binding OkVisibility}" Command="{Binding OkCommand}" IsDefault="{Binding IsOkDefault}" Margin="5 5 5 5" Height="42" Width="80" /> 
       <Button FontSize="25" Content="_Cancel" Visibility="{Binding CancelVisibility}" Command="{Binding CancelCommand}" IsDefault="{Binding IsCancelDefault}" Margin="5 5 5 5" Height="42" Width="80" /> 
      </StackPanel> 
     </Border> 
    </Grid> 


</Grid> 

は、誰もがなぜ知っていますか?

+0

XAMLはありますか? "私の特別なキャプション"とは特別なケースとして扱われるリテラル文字列 ""特定のメッセージキャプション "を意味しますか?その場合、メッセージボックスで独自のサイズを判断できるようにすると、問題は解決しますか? HTMLウィジェットを使用してメッセージテキストを表示していますか?そのキャプションを渡すときに、角かっこの間に何かを渡しますか? –

+0

WPFMessageBoxWindowにはXAMLがあります。そして、はい、私は特別な場合として扱われる文字列を意味します。 WPFMessageBoxWindow XAMLがサイズを決定しています。私はHTMLウィジェットを使用していません。私はキャプションを渡すときに常に角かっこの間に何かを渡します。 –

+0

あなたはそのXAMLを共有している可能性があります –

答えて

0

あなたは 'Message'という名前のプロパティにテキストをバインドしていますが、私はあなたのVMでそれを見ません...私がそれを逃していない限り!

私の賭けは、そのプロパティが更新されたときにNotifyPropertyChangedイベントを発行していないということです。ビューの前にビューモデルが作成されていればビューはVMにクエリを実行しますが、ビューの少し後、ビューは照会されると空の文字列を受け取ります。プロパティはVM内で更新されますが、ビューにはそのことについて決して伝えられません。ちょうど馬鹿。

関連する問題