2017-03-13 3 views
6

J'ai un problème de compréhension de l'opacité dans WPF. J'ai le code posté ci-dessous. Mes questions sont:Comportement d'opacité imprévisible dans les polices WPF

  • Pourquoi le rectangle et la police ont-ils des couleurs différentes?
  • Pourquoi les deux TextBlocks ont-ils des couleurs différentes lorsque je change la taille de la police?

j'attendre à ce que, quand je snoop la couleur avec un sélecteur de couleur, noir avec une opacité de 50% viderait # 7F7F7F, mais je reçois # C2C2C2 pour le TextBlock plus petit, et le # 7F7F7F prévu pour la plus grande police et le rectangle.

La question a été partiellement posée au https://github.com/ButchersBoy/MaterialDesignInXamlToolkit/issues/408 mais n'a pas reçu de réponse appropriée.

Toute aide est appréciée!

Le code est:

<Window x:Class="WpfPlay.MainWindow" 
     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:WpfPlay" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="800" Width="800" Background="White"> 

    <Window.Resources> 
     <SolidColorBrush x:Key="ForeBrush" Color="Black" Opacity="0.5"/> 
     <SolidColorBrush x:Key="BackBrush" Color="White" Opacity="1.0"/> 
     <Style TargetType="TextBlock" x:Key="TextBlockStyle"> 
      <Setter Property="Foreground" Value="{StaticResource ForeBrush}"/> 
      <Setter Property="Background" Value="{StaticResource BackBrush}"/> 
      <Setter Property="FontSize" Value="48"/> 
      <Setter Property="FontWeight" Value="Bold"/> 
     </Style> 

     <Style TargetType="TextBlock" x:Key="TextBlockLargeStyle"> 
      <Setter Property="Foreground" Value="{StaticResource ForeBrush}"/> 
      <Setter Property="Background" Value="{StaticResource BackBrush}"/> 
      <Setter Property="FontSize" Value="100"/> 
      <Setter Property="FontWeight" Value="Bold"/> 
     </Style> 
    </Window.Resources> 

    <StackPanel Orientation="Vertical" Background="White"> 
     <TextBlock Text="Click me" HorizontalAlignment="Center" Style="{StaticResource TextBlockStyle}" Margin="20"/> 
     <TextBlock Text="Click me" HorizontalAlignment="Center" Style="{StaticResource TextBlockLargeStyle}" Margin="20"/> 
     <Rectangle Width="100" Height="100" HorizontalAlignment="Center" Margin="20" Fill="{StaticResource ForeBrush}"/> 
    </StackPanel> 
</Window> 
+0

Je ne sais pas pourquoi cela arrive, mais Je peux vérifier les changements de couleur à FontSize = 80 sur mon ordinateur. –

+0

Selon https://support.microsoft.com/nl-be/help/2712383/wpf-application-hangs-when-using-fonts-over-100pts-in-size, Net 3.5 rencontre des difficultés avec des fonsizes de 100 et plus grand (spécifiquement, quand 100pts après des transformations, des arrangements de ppp etc.). Peut-être y a-t-il encore un bug "restes" concernant l'opacité et les polices de caractères de 100 points et plus. – Xilconic

Répondre

1

Vous pouvez utiliser une solution de contournement en réglant l'opacité sur le TextBlock complet. Cela changerait bien sûr aussi l'opacité du backbrush, donc il ne donnera pas l'effet désiré si vous avez une couleur de fond StackPanel différente.

<TextBlock Text="Click me" HorizontalAlignment="Center" Style="{StaticResource TextBlockStyle}" Opacity="0.5"/> 

Mais il y a aussi la possibilité de remplacer le ControlTemplate d'un TextBlock et connectez la propriété d'opacité au premier plan seulement.

Ou vous pourriez faire une grille avec l'intérieur d'un TextBlock, de sorte que vous pouvez définir la propriété d'opacité sur le TextBlock sans toucher le fond du rectangle, il est assis dans.