Bene, l'inversione del colore potrebbe essere eseguita come un effetto bitmap, ma c'è un modo più semplice.
Fai un Grid
che sarà il contenitore per 3 pannelli bambino in modo che questi pannelli bambino si sovrappongono l'un l'altro completamente:
Mettere il testo in cui si desidera in un pannello che ha uno sfondo Transparent
(che fanno da predefinito). Denominare questo pannello 'maschera'.
Creare un altro pannello chiamato 'mainbackground' e assegnargli il gradiente principale come sfondo. Metti questo dopo il pannello 'maschera' in modo che copra il testo
Crea un altro pannello chiamato 'invertedforeground' e dagli il gradiente opposto. Per ciascun valore di colore nel gradiente principale, assegna a questo il contrario (ad es. Se un colore è #FF0000
, inserisci #00FFFF
). Puoi animare questo gradiente proprio come puoi animare il primo, solo con valori opposti. Quindi imposta OpacityMask
di questo pannello su VisualBrush
e imposta la proprietà Visual
su {Binding ElementName=mask}
.
<Grid>
<Grid.Resources>
<local:MyColorConverter x:Key="colorConverter" />
</Grid.Resources>
<Grid
Name="mask">
<TextBlock
Name="mytext"
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontSize="32"
Foreground="White"
FontWeight="Bold">Blah blah blah</TextBlock>
</Grid>
<Grid Name="mainbackground">
<Grid.Background>
<LinearGradientBrush
ColorInterpolationMode="ScRgbLinearInterpolation"
EndPoint="1,0">
<GradientStop x:Name="stop1"
Color="#FF0000"
Offset="0" />
<GradientStop x:Name="stop2"
Color="#00FF00"
Offset="0.5" />
<GradientStop x:Name="stop3"
Color="#0000FF"
Offset="1" />
</LinearGradientBrush>
</Grid.Background>
</Grid>
<Grid Name="invertedforeground">
<Grid.Background>
<LinearGradientBrush
ColorInterpolationMode="ScRgbLinearInterpolation"
EndPoint="1,0">
<GradientStop
Color="{Binding ElementName=stop1, Path=Color, Converter={StaticResource colorConverter}}"
Offset="0" />
<GradientStop
Color="{Binding ElementName=stop2, Path=Color, Converter={StaticResource colorConverter}}"
Offset="0.5" />
<GradientStop
Color="{Binding ElementName=stop3, Path=Color, Converter={StaticResource colorConverter}}"
Offset="1" />
</LinearGradientBrush>
</Grid.Background>
<Grid.OpacityMask>
<VisualBrush
Visual="{Binding ElementName=mask}" />
</Grid.OpacityMask>
</Grid>
</Grid>
probabilmente si potrebbe utilizzare convertitori vincolanti e valore in modo che avete solo bisogno di animare un gradiente e l'altro segue semplicemente.
Edit: Ho provato a installare un pennello Primo piano invertita per il testo, ma sarebbe attenersi a coordinate 's il TextBlock
, così sono ritornato alla precedente soluzione di utilizzare il testo come un OpacityMask
.
Edit 2: ho aggiunto esempio di utilizzo di un costume IValueConverter
e vincolante i colori del gradiente di testo al gradiente di originale. È inoltre possibile utilizzare binding e un convertitore da qualche parte più in alto, ad esempio Background
vincolante nella proprietà mainbackground
Background
e il convertitore accetta il pennello sfumatura di input e restituisce un pennello sfumato diverso configurazione molto diversa rispetto all'originale).
Potete fornire un esempio di come si cambiano i colori del gradiente? –
Questo è il punto. Voglio un pennello dinamico, non statico. – Shimmy
Cosa intendi per dinamico? Assegni colori diversi nel codice? Cambiano come parte di un'animazione? Vuoi semplicemente dire che usi DynamicResource invece di StaticResource? –