我为我正在处理的 WPF 应用程序构建了一个自定义窗口镶边。当然,我需要具有用于关闭/最小化/最大化/等的MouseOver-Effects。纽扣。该应用程序的风格应该适合 Office365 应用程序和 Pwer BI,因此我希望当鼠标悬停在关闭按钮上时关闭按钮变为红色。所有其他按钮应变为深灰色或黑色。我为这些按钮制作了一种样式,其中包含必要的触发器。由于我不知道如何为样式中的右侧按钮指定正确的颜色,因此我创建了一个 IValueConverter,它采用元素的名称,并根据该名称返回正确的 SolidColorBrush。遗憾的是它不能正常工作。转换器永远不会被调用。 转换器:
转换器:
internal class MouseOverColorConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if((string)value == "closeButton")
{
return new SolidColorBrush(Color.FromArgb(255, 232, 17, 35));
}
else
{`your text`
return new SolidColorBrush(Color.FromArgb(255, 41, 40, 39));
}
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
容纳按钮的 DockPanel
<DockPanel Height="38" LastChildFill="False" Grid.Column="2">
<RibbonButton Style="{StaticResource WindowChromeButton}" shell:WindowChrome.IsHitTestVisibleInChrome="True"
Name="closeButton"
DockPanel.Dock="Right"
Click="OnCloseButtonClick" Focusable="True" IsEnabled="True" Height="38" Width="48" Margin="1" LargeImageSource="{Binding CloseWindowIcon}">
</RibbonButton>
<RibbonButton Style="{StaticResource WindowChromeButton}" shell:WindowChrome.IsHitTestVisibleInChrome="True"
Name="maximizeButton"
DockPanel.Dock="Right"
Click="OnMaximizeRestoreButtonClick" Focusable="True" IsEnabled="True" Height="38" Width="48" Margin="1" LargeImageSource="{Binding MaximizeWindowIcon}">
</RibbonButton>
<RibbonButton Style="{StaticResource WindowChromeButton}" shell:WindowChrome.IsHitTestVisibleInChrome="True"
Name="restoreButton"
DockPanel.Dock="Right"
Click="OnMaximizeRestoreButtonClick" Focusable="True" IsEnabled="True" Height="38" Width="48" Margin="1" LargeImageSource="{Binding RestoreWindowIcon}">
</RibbonButton>
<RibbonButton Style="{StaticResource WindowChromeButton}" shell:WindowChrome.IsHitTestVisibleInChrome="True"
Name="minimizeButton"
DockPanel.Dock="Right"
Click="OnMinimizeButtonClick" Focusable="True" IsEnabled="True" Height="38" Width="48" Margin="1" LargeImageSource="{Binding MinimizeWindowIcon}">
</RibbonButton>
</DockPanel>
风格
<Style TargetType="{x:Type RibbonButton}" x:Key="WindowChromeButton"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:s="clr-namespace:System;assembly=mscorlib"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Setter Property="SnapsToDevicePixels" Value="true" />
<Setter Property="Height"
Value="Auto" />
<Setter Property="Width"
Value="Auto" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type RibbonButton}">
<Border x:Name="ButtonBorder" TextBlock.Foreground="{TemplateBinding Foreground}"
BorderThickness="0"
CornerRadius="0"
BorderBrush="#00FFFFFF"
Background="#00FFFFFF"
Visibility="Visible">
<Image Source="{TemplateBinding RibbonControlService.LargeImageSource}" Name="PART_Image" Width="16" Height="16" Margin="{DynamicResource {ComponentResourceKey TypeInTargetAssembly=Ribbon, ResourceId=LargeImageMargin}}" HorizontalAlignment="{TemplateBinding Control.HorizontalContentAlignment}" VerticalAlignment="Center" RenderOptions.BitmapScalingMode="NearestNeighbor" />
</Border>
<ControlTemplate.Resources>
<local:ButtonLayoutConverter x:Key="ButtonLayoutConverter" Height="30"/>
<local:MouseOverColorConverter x:Key="MouseOverColorConverter"/>
</ControlTemplate.Resources>
<ControlTemplate.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsPressed" Value="True"/>
<Condition Property="IsMouseOver" Value="True"/>
</MultiTrigger.Conditions>
<MultiTrigger.Setters>
<Setter TargetName="ButtonBorder" Property="Background" Value="{Binding ElementName=Self, Path=Name, Converter={StaticResource MouseOverColorConverter}}"/>
</MultiTrigger.Setters>
</MultiTrigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsPressed" Value="False"/>
<Condition Property="IsMouseOver" Value="True"/>
</MultiTrigger.Conditions>
<MultiTrigger.Setters>
<Setter TargetName="ButtonBorder" Property="Background" Value="{Binding ElementName=Self, Path=Name, Converter={StaticResource MouseOverColorConverter}}"/>
</MultiTrigger.Setters>
</MultiTrigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsPressed" Value="True"/>
<Condition Property="IsMouseOver" Value="False"/>
</MultiTrigger.Conditions>
<MultiTrigger.Setters>
<Setter TargetName="ButtonBorder" Property="Background" Value="{Binding ElementName=Self, Path=Name, Converter={StaticResource MouseOverColorConverter}}"/>
<Setter TargetName="ButtonBorder" Property="BorderBrush" Value="#FF605E5C"/>
</MultiTrigger.Setters>
</MultiTrigger>
<Trigger Property="IsPressed" Value="True">
<Setter TargetName="ButtonBorder" Property="Background" Value="{Binding ElementName=Self, Path=Name, Converter={StaticResource MouseOverColorConverter}}"/>
</Trigger>
<Trigger Property="IsEnabled"
Value="false">
<Setter Property="Opacity"
Value="0.4" />
<Setter Property="Foreground"
Value="{DynamicResource DisabledForegroundBrush}" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
我尝试在按钮本身上设置 MouseOverBackground-Property,但这没有产生任何结果。我希望一起摆脱转换器。