c# - 自定义画笔 - 我想要两个渐变将它们链接在一起

标签 c# wpf silverlight user-interface

我正在制作条形图,我想为每个条形图设置两个单独的渐变。首先,我想要一个从上到下从纯红色到透明红色的渐变。我想在其顶部绘制一个从右到左、黑色到不透明的渐变。

所以 - 在左下角我们应该有;

  • 左下 - Alpha 0
  • 右下 - Alpha 0
  • 左上 - Alpha 255 红色
  • 右上角 - Alpha 255 黑色

所以实际上我想采用纯色,向黑色添加从左到右的渐变,然后获取其输出并向透明度添加从上到下的渐变。

所有这一切,我希望它在一个刷子中,这甚至可能吗?

最佳答案

是的。使用 VisualBrush,其 Visual 是 Border 内的 Rectangle 来组合其他两个画笔。

像这样:

<LinearGradientBrush x:Key="UnderBrush" EndPoint="0,1"> 
  <GradientStop Color="#FFFF0000" Offset="0" /> 
  <GradientStop Color="#00FF0000" Offset="1" /> 
</LinearGradientBrush> 

<LinearGradientBrush x:Key="OverBrush" EndPoint="1,0"> 
  <GradientStop Color="#00000000" Offset="0" /> 
  <GradientStop Color="#FF000000" Offset="1" /> 
</LinearGradientBrush> 

<VisualBrush x:Key="CombinedBrush">
  <VisualBrush.Visual>
    <Border Background="{StaticResource UnderBrush}">
      <Rectangle Fill="{StaticResource OverBrush}" Width="1" Height="1" />
    </Border>
  </VisualBrush.Visual>
</VisualBrush>

CombinedBrush 可用于绘制条形图,您将获得描述的效果。

Silverlight 版本

由于 Silverlight 没有 VisualBrush,因此您必须在代码中构建 WritableBitmap 并将其与 ImageBrush 一起使用:

<ImageBrush x:Key="CombinedBrush">
  <my:VisualBrushSimulator.Visual>
    <Border Background="{StaticResource UnderBrush}">
      <Rectangle Fill="{StaticResource OverBrush}" Width="1" Height="1" />
    </Border>
  </my:VisualBrushSimulator.Visual>
</ImageBrush>

下面是 VisualBrushSimulator 的实现方式:

public class VisualBrushSimulator : DependencyObject
{
  public Visual GetVisual(DependencyObject obj) { return (Visual)obj.GetValue(VisualProperty); }
  public void SetVisual(DependencyObject obj, Visual value) { obj.SetValue(VisualProperty, value); }
  public static readonly DependencyProperty VisualProperty = DependencyProperty.RegisterAttached("Visual", typeof(Visual), typeof(VisualBrushSimulator), new PropertyMetadata
  {
    PropertyChangedCallback = (obj, e) =>
    {
      int width=1000;
      int height=1000;
      var bitmap = new WritableBitmap(width, height);
      bitmap.Render((Visual)e.NewValue, new ScaleTransform { ScaleX = width, ScaleY = height });
      ((ImageBrush)obj).ImageSource = bitmap;
    }
  });
}

请注意,这不是真正的 VisualBrush 模拟,因为对 Visual 的更改不会影响画笔。

关于c# - 自定义画笔 - 我想要两个渐变将它们链接在一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2834364/

相关文章:

c# - 从主机名创建 IPEndPoint

c# - WPF 应用程序和 DirectX 光栅化器中的访问冲突异常

c# - Silverlight 4.0 : Using WebClient UploadStringAsync POST request to .Net 4 网络服务

silverlight - 安装 Silverlight 是否需要本地管理员权限?

c# - Telerik 报告中的嵌套表?

javascript - 使用提交按钮的 JQuery DataTable 内联编辑 - 后返回 405(方法不允许)

c# - 如何用不同的颜色为 RichTextBox 中的不同单词着色?

WPF : Binding Order

wpf - 在 Windows 窗体中绘制 30fps 图表

Silverlight 架构指南 - 延迟加载