WPF. Messagebox. Как поменять стиль диалогового окна?

800
31 января 2017, 19:55

Стандартный стиль не вписывается в мой дизайн, а вся валидация идет через Messagebox.Show("Сообщение"). Где изменить стиль? Причем надо функционал изменения, как у обычного окна, так как я сделал прозрачный стиль основных окон и использую стилизированные элементы...

Answer 1

Никак. MessageBox — системный, он не стилизуется.

Используйте самописный MessageBox, благо там писать не сильно много.

Вот вам пример:

XAML:

<Window x:Class="Test.MessageBox"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Test"
        mc:Ignorable="d"
        Title="Message Box" Height="200" Width="300">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <TextBlock Name="MessageContainer" TextWrapping="WrapWithOverflow" Margin="10"/>
        <StackPanel Name="ButtonContainer" Grid.Row="1" Orientation="Horizontal"
                    HorizontalAlignment="Right" Margin="10">
            <StackPanel.Resources>
                <Style TargetType="Button">
                    <Setter Property="MinHeight" Value="25"/>
                    <Setter Property="MinWidth" Value="75"/>
                    <Setter Property="Margin" Value="10,0,0,0"/>
                </Style>
            </StackPanel.Resources>
        </StackPanel>
    </Grid>
</Window>

Code-behind:

public partial class MessageBox : Window
{
    public MessageBox()
    {
        InitializeComponent();
    }
    void AddButtons(MessageBoxButton buttons)
    {
        switch (buttons)
        {
        case MessageBoxButton.OK:
            AddButton("OK", MessageBoxResult.OK);
            break;
        case MessageBoxButton.OKCancel:
            AddButton("OK", MessageBoxResult.OK);
            AddButton("Cancel", MessageBoxResult.Cancel, isCancel: true);
            break;
        case MessageBoxButton.YesNo:
            AddButton("Yes", MessageBoxResult.Yes);
            AddButton("No", MessageBoxResult.No);
            break;
        case MessageBoxButton.YesNoCancel:
            AddButton("Yes", MessageBoxResult.Yes);
            AddButton("No", MessageBoxResult.No);
            AddButton("Cancel", MessageBoxResult.Cancel, isCancel: true);
            break;
        default:
            throw new ArgumentException("Unknown button value", "buttons");
        }
    }
    void AddButton(string text, MessageBoxResult result, bool isCancel = false)
    {
        var button = new Button() { Content = text, IsCancel = isCancel };
        button.Click += (o, args) => { Result = result; DialogResult = true; };
        ButtonContainer.Children.Add(button);
    }
    MessageBoxResult Result = MessageBoxResult.None;
    public static MessageBoxResult Show(string caption, string message,
                                        MessageBoxButton buttons)
    {
        var dialog = new MessageBox() { Title = caption };
        dialog.MessageContainer.Text = message;
        dialog.AddButtons(buttons);
        dialog.ShowDialog();
        return dialog.Result;
    }
}

В результате у вас получается нормальное окно, и вы можете стилизовать его, как вам угодно.

Вам придётся ещё решить проблемы с локализацией, с изменением размеров окна (не стоит давать пользователю возможность максимизировать окно) и т. п.

READ ALSO
получить элемент списка xaml

получить элемент списка xaml

есть список lisview с кнопками внутрикак можно получить элемент списка и объект данных, кликнув по какой-либо кнопке внутри него ?

409
Отключение кнопки WPF

Отключение кнопки WPF

Есть некоторая кнопка, которая создана от класса UserControl(то есть является не стандартной)И мне нужно, что бы когда свойство этой кнопки IsEnabled...

483
Шаблон для текстового редактора Visual Studio 2013

Шаблон для текстового редактора Visual Studio 2013

Как в Visual Studio 2013, создать шаблон в текстовом редактореНа подобие того как делает решарпер

380
Получить строку по индексу в DataGrid

Получить строку по индексу в DataGrid

Пытаюсь сделать запись содержимого DataGrid в html-таблицу

419