IValueConverter 将元素名称转换为背景颜色

问题描述 投票:0回答:0

我为我正在处理的 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,但这没有产生任何结果。我希望一起摆脱转换器。

c# wpf mouseover ivalueconverter valueconverter
© www.soinside.com 2019 - 2024. All rights reserved.