2016-04-18 15 views
-1

私はMahAppsフレームワークを使用しており、MouseOverでタイルを強調表示するスタイル(How to change tile background on mouse over in WPF?を参照)があります。マウスオーバーでタイルの背景色を明るく/暗くするには?

<local:ColorConverter x:Key="colorConverter" /> 
<Style x:Key="highlightedTile" TargetType="mah:Tile"> 
    <Setter Property="Background" Value="Purple" /> 
    <Style.Triggers> 
     <Trigger Property="IsMouseOver" Value="True"> 
      <Setter Property="Background" Value="{Binding Path=Background, RelativeSource={RelativeSource Self}, Converter={StaticResource colorConverter}, Mode=OneTime, FallbackValue=red}" /> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

色変換コードは次のとおりです。

class ColorConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     byte[] temp = StringToByteArray(value.ToString().Substring(1, 8)); // Remove # 
     Color color = Color.FromArgb(temp[0], temp[1], temp[2], temp[3]); 
     System.Drawing.Color darkColor = System.Windows.Forms.ControlPaint.Dark(System.Drawing.Color.FromArgb(color.A, color.R, color.G, color.B), 0.1f); 
     return new SolidColorBrush(Color.FromArgb(darkColor.A, darkColor.R, darkColor.G, darkColor.B)); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 

    public static byte[] StringToByteArray(string hex) 
    { 
     if (hex.Length % 2 == 1) 
      throw new Exception("The binary key cannot have an odd number of digits"); 

     byte[] arr = new byte[hex.Length >> 1]; 

     for (int i = 0; i <hex.Length>> 1; ++i) 
     { 
      arr[i] = (byte)((GetHexVal(hex[i << 1]) << 4) + (GetHexVal(hex[(i << 1) + 1]))); 
     } 

     return arr; 
    } 

    public static int GetHexVal(char hex) 
    { 
     int val = (int)hex; 
     //For uppercase A-F letters: 
     return val - (val < 58 ? 48 : 55); 
     //For lowercase a-f letters: 
     //return val - (val < 58 ? 48 : 87); 
     //Or the two combined, but a bit slower: 
     //return val - (val < 58 ? 48 : (val < 97 ? 55 : 87)); 
    } 
} 

は基本的に、私のことができるようにしたい:

  1. は、デザイナビューでタイルの背景を設定します。 DONE
  2. このスタイルをタイルに適用します。ランタイム中にMouseOverでその背景が黒くなる(タイルを強調表示する)ようにし、マウスがタイルを持っているときに初期カラーに戻ります(ホストコントロールの背景はこのロジックに影響しません)。 NEED HELPの

私のコードは、私は、スタイル(この場合は、「パープル」)で非強調表示の背景色を設定している場合にのみ機能します。この色をスタイルに設定しないと(最初の行を削除すると)、コードは、タイルのデフォルトの青色の背景色でのみ機能します(MainWindow.xamlで色を設定した場合、コンバータはトリガーされません。ブレークポイントを使用して)。当初はこのバインディングを使用しましたが、うまくいきませんでした。

<Setter Property="Background" Value="{Binding Path=Background.Color, RelativeSource={RelativeSource Self}}" /> 

私は間違っていますか?それとも、私は実際に達成可能なことを求めているのですか?

+0

私はMahAppsをよく知っているわけではありませんが、targettypeは一般的に 'TargetType =" controls:Tile "に近いものではありません。また、値バインディングには、親戚だけでなく、バックグラウンドに。カラー? –

+0

@ChrisW。 TargetTypeは、コントロールとコントロールの両方で動作します。タイル。私はこれを試しましたが、動作しません:タイルコードは次のとおりです。上記の私のコードは、最初のSetter Propertyを除き、明示的にタイルの背景色を設定しない場合にのみ機能します。 –

+0

@jstreetありがとうございました!しかし、私はこのコードは、私はタイルの背景色を設定しない場合にのみ動作することに気づいた。私はデフォルトの青色を残しても動作しますが、背景色(MainWindow.xaml内)、例えば 'Background =" Purple "'を設定してもコンバータを起動しません(ブレークポイントを使って検証します)。 –

答えて

0

タイルのスタイルをオーバーライドし、ControlTemplateトリガーでコンバーターを使用することをお勧めします。

enter image description here

次XAMLソースも利用可能であるMahAppsの最新のソースで動作しますNuGet(プレリリース)を争います。

<local:ColorConverter x:Key="colorConverter" /> 
<Style x:Key="CustomTileStyle" BasedOn="{StaticResource {x:Type controls:Tile}}" TargetType="{x:Type controls:Tile}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="controls:Tile"> 
       <Grid> 
        <Border x:Name="PART_Border" 
          Background="{TemplateBinding Background}" 
          BorderBrush="{TemplateBinding BorderBrush}" 
          BorderThickness="{TemplateBinding BorderThickness}" 
          SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"> 
         <Grid> 
          <StackPanel HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
             VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
             Orientation="Horizontal"> 
           <ContentPresenter RecognizesAccessKey="True" /> 
           <TextBlock VerticalAlignment="Center" 
              FontSize="{TemplateBinding CountFontSize}" 
              Text="{TemplateBinding Count}" /> 
          </StackPanel> 
          <Label HorizontalAlignment="{TemplateBinding HorizontalTitleAlignment}" 
            VerticalAlignment="{TemplateBinding VerticalTitleAlignment}" 
            Foreground="{TemplateBinding Foreground}"> 
           <AccessText Margin="3" 
              Foreground="{TemplateBinding Foreground}" 
              FontSize="{TemplateBinding TitleFontSize}" 
              Text="{TemplateBinding Title}" 
              TextWrapping="Wrap" /> 
          </Label> 
         </Grid> 
        </Border> 
        <Border x:Name="PART_HoverBorder" 
          BorderBrush="{TemplateBinding controls:ControlsHelper.MouseOverBorderBrush}" 
          BorderThickness="2" 
          Opacity="0" 
          SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" /> 
       </Grid> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsMouseOver" Value="True"> 
         <Setter TargetName="PART_Border" Property="Background" Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Background, Mode=OneWay, Converter={StaticResource colorConverter}}" /> 
        </Trigger> 
        <MultiDataTrigger> 
         <MultiDataTrigger.Conditions> 
          <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=(controls:ControlsHelper.MouseOverBorderBrush), Mode=OneWay, Converter={x:Static converters:IsNullConverter.Instance}}" Value="False" /> 
          <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsMouseOver, Mode=OneWay}" Value="True" /> 
         </MultiDataTrigger.Conditions> 
         <Setter TargetName="PART_HoverBorder" Property="Opacity" Value="0.6" /> 
        </MultiDataTrigger> 
        <Trigger Property="Button.IsPressed" Value="True"> 
         <Setter Property="RenderTransform"> 
          <Setter.Value> 
           <ScaleTransform CenterX="0.5" 
               CenterY="0.5" 
               ScaleX="0.98" 
               ScaleY="0.98" /> 
          </Setter.Value> 
         </Setter> 
        </Trigger> 
        <Trigger Property="IsEnabled" Value="False"> 
         <Setter Property="Opacity" Value=".55" /> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

希望します。

+0

ありがとう!これは私の問題を解決します。しかし、 "Horizo​​ntalTitleAlignment"と "VerticalTitleAlignment"ではなく "Horizo​​ntalAlignment"と "VerticalAlignment"を書く必要がありました。また、「名前空間接頭辞変換が定義されていません」というエラーが発生したため、最初のMultiDataTrigger条件を削除する必要がありました。 –

+0

ええ、ええ、私はちょうどMahAppsの最新のソース(プレリリース)からこれをコピーしました。 – punker76

関連する問題