Vâng, đảo màu có thể được thực hiện dưới dạng hiệu ứng bitmap, nhưng có cách đơn giản hơn.
Thực hiện một Grid
đó sẽ là container cho 3 tấm đứa trẻ để những tấm đứa trẻ sẽ chồng chéo nhau hoàn toàn:
Đặt văn bản mà bạn muốn nó trong một bảng mà có một nền Transparent
(họ làm bằng cách mặc định). Đặt tên bảng này là 'mặt nạ'.
Tạo một bảng khác gọi là 'mainbackground' và đặt nó làm gradient chính làm nền của nó. Đặt bảng này sau bảng điều khiển 'mặt nạ' để nó bao gồm văn bản
Tạo một bảng khác có tên là 'đảo ngược' và cho độ dốc ngược lại. Đối với mỗi giá trị màu trong gradient chính, đặt giá trị màu này ngược lại (ví dụ: nếu một màu là #FF0000
, hãy đặt #00FFFF
). Bạn có thể tạo hiệu ứng cho gradient này giống như bạn có thể tạo hiệu ứng đầu tiên, chỉ với các giá trị ngược lại. Sau đó, bạn đặt OpacityMask
của bảng này thành VisualBrush
và đặt thuộc tính 's Visual
thành {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>
Bạn có thể sử dụng trình chuyển đổi ràng buộc và giá trị để bạn chỉ cần tạo hoạt ảnh cho một gradient và đơn vị khác chỉ theo sau.
Edit: tôi đã cố gắng thiết lập một bàn chải Foreground ngược cho các văn bản, nhưng nó sẽ dính vào tọa độ của TextBlock
, vì vậy tôi trở lại là giải pháp trước đây của việc sử dụng các văn bản như một OpacityMask
.
Chỉnh sửa 2: tôi thêm ví dụ sử dụng một tùy chỉnh IValueConverter
và ràng buộc màu gradient văn bản để gradient gốc. Bạn cũng có thể sử dụng liên kết và bộ chuyển đổi ở đâu đó cao hơn, chẳng hạn như thuộc tính Background
của thuộc tính Background
và bộ chuyển đổi lấy cọ vẽ đầu vào và trả về một bàn chải gradient khác (điều này cho phép bạn tạo một gradient với cấu hình khác với bản gốc).
Bạn có thể cung cấp ví dụ về cách bạn thay đổi màu của gradient không? –
Đó là vấn đề. Tôi muốn có một bàn chải động, không tĩnh. – Shimmy
Bạn có ý nghĩa gì bởi năng động? Bạn chỉ định các màu khác nhau trong mã? Chúng thay đổi như là một phần của hoạt ảnh? Bạn chỉ đơn giản có nghĩa là bạn sử dụng DynamicResource thay vì StaticResource? –