65.9K
CodeProject 正在变化。 阅读更多。
Home

WPF 简单渐变编辑器 (C#)

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.61/5 (18投票s)

2010年2月1日

CPOL

2分钟阅读

viewsIcon

90200

downloadIcon

3646

C# 中 WPF 的简单渐变编辑器

引言

GradEditWPF 是一个为 WPF 设计的极其简单的渐变编辑器。它输出 XAML 代码,并允许轻松选择常用的系统颜色。

背景

Windows 演示框架 (WPF) 具有令人印象深刻的功能,但我找不到一个易于编辑或试验的渐变工具。为了解决这个小问题,我编写了这个极其简单的编辑器。

本项目中缺少一些有用的功能,例如任意设置任何 RGB 值以及更改每个 GradientStop 的大小。

Using the Code

GradEditWPF 旨在作为独立应用程序运行,以帮助开发人员/设计师为他们的 WPF 应用程序创建渐变。

应用程序界面

应用程序的顶部三分之一包含所有用于编辑渐变的功能。

  • “色带”下拉菜单允许用户设置要使用的 GradientStop 数量。
  • System.Windows.Media.Color 组合框可以轻松选择系统颜色。
  • 滑块允许用户快速跳转到适当的 GradientStop 进行编辑。

线性渐变画笔的基本 XAML

<LinearGradientBrush StartPoint="0,0.5" EndPoint="1,0.5">
  <GradientStop Color="Black" Offset="0.0" />
  <GradientStop Color="White" Offset="0.5" />
  <GradientStop Color="Black" Offset="1.0" />
</LinearGradientBrush> 

上面的代码将生成三个 GradientStop (颜色带)黑色到白色到黑色的渐变,作为 LinearGradientBrush。该软件的 XAML 输出旨在与此匹配。

系统颜色枚举(存储在 Dictionary.xaml 文件中)是从 http://stackoverflow.com/questions/562682/how-can-i-list-colors-with-wpf 借用的。

C# 代码有两个值得注意的方法

  1. 通过直接 WPF 操作的渐变预览逻辑
  2. 通过简单的 XML 生成的 XAML 输出

渐变预览逻辑

private void SetGradient()
{
    if (gradrect == null)
        return;
    LinearGradientBrush lgbrush = (LinearGradientBrush)gradrect.Fill;
    GradientStopCollection gscollection = lgbrush.GradientStops;
    
    GradientStop g;
    gscollection.Clear();
    for (int i = 0; i < currentPaletteSize; i++)
    {
        g = new GradientStop();
        g.Color = (Color)ColorConverter.ConvertFromString(colorNames[i]);
        g.Offset = (float)i / (float)(currentPaletteSize - 1);
        gscollection.Add(g);
    }
    Report();
} 

上面的逻辑从应用程序的 XAML 文件中指定的渐变矩形获取当前的 LinearGradientBrush

然后它获取 GradientStop 集合,清除它,并继续将每个 GradientStop 设置为 colorNames 数组中包含的颜色。这些名称与 System.Windows.Media.Colors 条目相同。

XAML 输出

private void Report()
{
    String report;
    report = "";
    
    double offset = 0;
    report = "<LinearGradientBrush StartPoint=\"0,0.5\" EndPoint=\"1,0.5\">\n";
    for (int i = 0; i < currentPaletteSize; i++)
    {
        if (currentPaletteSize > 0)
            offset = (double)i / (double)(currentPaletteSize - 1);
        else offset = 0;
        report += "\t<GradientStop Color=\"#" + colorNames[i] 
            + "\" Offset=\"" + offset + "\" />\n";
    }
    report += "</LinearGradientBrush>\n";
    if (textBoxGradXML!=null)
        textBoxGradXML.Text = report;
} 

XAML 输出代码非常简单。它创建一个包含从 colorNames 数组中提取的每个 GradientStop 颜色的名称的单个 string ,最后将文本框设置为该 string

关注点

作为 WPF 世界的入门项目,我发现编写一个我可以用来引导进一步 WPF 开发的简单工具非常有趣。我希望至少还有一位开发人员觉得该工具或技术有用。

历史

在初始上传中删除了一个字符 - 一个字母(XAML 输出代码中的多余 #)确实可能导致软件出现严重故障。

© . All rights reserved.