WPF - 在 Extended WPF Toolkit 中自定义 MessageBox 的样式
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/36864133/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
WPF - Customize the style of MessageBox in Extended WPF Toolkit
提问by VincentZHANG
For the sake of customization for MessageBox's style , I use this toolkit, and I copy the style code from its official page:
为了自定义 MessageBox 的 style ,我使用了这个工具包,我从它的官方页面复制了样式代码:
http://wpftoolkit.codeplex.com/wikipage?title=MessageBox&referringTitle=Documentation
http://wpftoolkit.codeplex.com/wikipage?title=MessageBox&referringTitle=文档
I changed it a bit:
我稍微改了一下:
<Application x:Class="TotaraEditor.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:TotaraEditor"
xmlns:toolkit="http://schemas.xceed.com/wpf/xaml/toolkit"
StartupUri="MainWindow.xaml"
ShutdownMode="OnMainWindowClose">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Themes/MetroDark/MetroDark.MSControls.Core.Implicit.xaml" />
<ResourceDictionary Source="Themes/MetroDark/MetroDark.MSControls.Toolkit.Implicit.xaml" />
</ResourceDictionary.MergedDictionaries>
<SolidColorBrush x:Key="MyButtonHoverBrush" Color="#FF2D2D30" />
<SolidColorBrush x:Key="MyButtonPressedBrush" Color="#FF03A9DD" />
<Style x:Key="MyCloseButtonStyle" TargetType="Button">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Grid>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal"/>
<VisualState x:Name="MouseOver">
<Storyboard>
<ObjectAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000" Storyboard.TargetName="Background" Storyboard.TargetProperty="(Border.Background)">
<DiscreteObjectKeyFrame KeyTime="00:00:00" Value="{StaticResource MyButtonHoverBrush}"></DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<VisualState x:Name="Pressed">
<Storyboard>
<ObjectAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000" Storyboard.TargetName="Background" Storyboard.TargetProperty="(Border.Background)">
<DiscreteObjectKeyFrame KeyTime="00:00:00" Value="{StaticResource MyButtonPressedBrush}"></DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Border x:Name="Background" CornerRadius="0,0,0,0" Background="Green">
<Border Margin="1,0,1,1" BorderBrush="#59FFFFFF" BorderThickness="1" CornerRadius="0,0,1,0"/>
</Border>
<ContentPresenter x:Name="contentPresenter" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}"/>
<Path x:Name="path" Fill="White" Margin="0,0,0,1" Visibility="Collapsed"
Height="60"
Width="7"
Stretch="Fill"
Opacity="1"
Data="M 2,6 C2,6 3,6 3,6 3,6 3,5 3,5 3,5 4,5 4,5 4,5 4,6 4,6 4,6 5,6 5,6 5,6 7,6 7,6 7,6 7,5 7,5 7,5 6,5 6,5 6,5 6,4 6,4 6,4 5,4 5,4 5,4 5,2 5,2 5,2 6,2 6,2 6,2 6,1 6,1 6,1 7,1 7,1 7,1 7,0 7,0 7,0 5,0 5,0 5,0 4,0 4,0 4,0 4,1 4,1 4,1 3,1 3,1 3,1 3,0 3,0 3,0 2,0 2,0 2,0 0,0 0,0 0,0 0,1 0,1 0,1 1,1 1,1 1,1 1,2 1,2 1,2 2,2 2,2 2,2 2,4 2,4 2,4 1,4 1,4 1,4 1,5 1,5 1,5 0,5 0,5 0,5 0,6 0,6 0,6 2,6 2,6 z"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style TargetType="{x:Type toolkit:MessageBox}">
<Setter Property="Background" Value="#FF1E1E1E" />
<Setter Property="BorderBrush" Value="#FF999999" />
<Setter Property="CaptionForeground" Value="#FFF1F1F1" />
<Setter Property="WindowBorderBrush" Value="#FF686868" />
<Setter Property="WindowBackground" Value="#FF2D2D30" />
<Setter Property="WindowOpacity" Value="0.3" />
<Setter Property="Foreground" Value="#FFF1F1F1"/>
<Setter Property="CloseButtonStyle" Value="{StaticResource MyCloseButtonStyle}"/>
</Style>
</ResourceDictionary>
</Application.Resources>
</Application>
This is how I use it in code behind:
这就是我在后面的代码中使用它的方式:
var res = Xceed.Wpf.Toolkit.MessageBox.Show(
"R U sure?",
"Confirm dialog",
MessageBoxButton.YesNoCancel,
MessageBoxImage.None,
MessageBoxResult.Cancel,
null
);
if ("Cancel" == res.ToString()) {...}
else if ("No" == res.ToString()) {...}
else if ("Yes" == res.ToString()) {...}
else {...}
As there is no way to touch the XAML of those buttons, how should I change the buttons style? At least I want to remove the glowing effect of the header.
由于无法触摸这些按钮的 XAML,我应该如何更改按钮样式?至少我想去除标题的发光效果。
Thanks.
谢谢。
UPDATE
更新
I am sure the glowing effect is not caused by some style applied to the Label, it is a styled rectangle underneath the Label, I found this in WPF Inspector:
我确定发光效果不是由应用于标签的某些样式引起的,它是标签下方的样式矩形,我在 WPF Inspector 中找到了这个:
After I set the height of that rect to 0, that glowing thing disappeared.
在我将该矩形的高度设置为 0 后,那个发光的东西消失了。
回答by jsanalytics
You can change the button style like this:
您可以像这样更改按钮样式:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
Xceed.Wpf.Toolkit.MessageBox mbox = new Xceed.Wpf.Toolkit.MessageBox();
mbox.OkButtonStyle = (Style)Resources["ButtonStyle1"];
mbox.OkButtonContent = "Click Me !";
mbox.Caption = "My custom caption";
mbox.Text = "My custom message";
mbox.ShowDialog();
}
XAML:
XAML:
<Style x:Key="ButtonStyle1" TargetType="{x:Type Button}">
<Setter Property="Background" Value="Green"></Setter>
<Setter Property="Foreground" Value="White"></Setter>
</Style>
As for the glowing effect in your caption, you have to modify the style you copied from the link you posted accordingly, or create your own style.
至于标题中的发光效果,您必须相应地修改从您发布的链接中复制的样式,或者创建自己的样式。
EDIT: Using MetroDarkstyle:
编辑:使用MetroDark样式:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
var res = Xceed.Wpf.Toolkit.MessageBox.Show(
"R U sure?",
"Confirm dialog",
MessageBoxButton.YesNoCancel,
MessageBoxImage.None,
MessageBoxResult.Cancel,
(Style)Resources["MessageBoxStyle1"]
);
if ("Cancel" == res.ToString())
{
}
else if ("No" == res.ToString())
{
}
else if ("Yes" == res.ToString())
{
}
else
{
}
}
XAML:
XAML:
<Style x:Key="ButtonStyle1" TargetType="Button">
<Setter Property="Background" Value="LightGreen"></Setter>
<Setter Property="Foreground" Value="DarkGreen"></Setter>
</Style>
<Style x:Key="ButtonStyle2" TargetType="Button">
<Setter Property="Background" Value="LightCoral"></Setter>
<Setter Property="Foreground" Value="DarkRed"></Setter>
</Style>
<Style x:Key="ButtonStyle3" TargetType="Button">
<Setter Property="Background" Value="LightYellow"></Setter>
<Setter Property="Foreground" Value="DarkOrange"></Setter>
</Style>
<Style x:Key="MessageBoxStyle1" TargetType="{x:Type xctk:MessageBox}">
<Setter Property="Background" Value="#FF1E1E1E" />
<Setter Property="BorderBrush" Value="#FF999999" />
<Setter Property="CaptionForeground" Value="#FFF1F1F1" />
<Setter Property="WindowBorderBrush" Value="#FF686868" />
<Setter Property="WindowBackground" Value="#FF2D2D30" />
<Setter Property="WindowOpacity" Value="0.3" />
<Setter Property="Foreground" Value="#FFF1F1F1"/>
<Setter Property="CloseButtonStyle" Value="{StaticResource MyCloseButtonStyle}"/>
<Setter Property="YesButtonStyle" Value="{StaticResource ButtonStyle1}"></Setter>
<Setter Property="NoButtonStyle" Value="{StaticResource ButtonStyle2}"></Setter>
<Setter Property="CancelButtonStyle" Value="{StaticResource ButtonStyle3}"></Setter>
</Style>
EDIT 2:The caption glow is linked to the CaptionShadowBrush:
编辑 2:标题发光链接到CaptionShadowBrush:
<Setter Property="CaptionShadowBrush" Value="LightCoral"></Setter>
You can either set it to Transparent, or get rid of it altogether:
您可以将其设置为Transparent,或者完全摆脱它:
<Setter Property="CaptionShadowBrush" Value="Transparent"></Setter>


