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

我的 Silverlight 条形码软件

starIconstarIconstarIconstarIconstarIcon

5.00/5 (4投票s)

2009年5月18日

BSD

5分钟阅读

viewsIcon

46276

downloadIcon

2416

Silverlight 中的条形码软件应用程序。

My Silveright Barcode Software

引言

这是对 WPF 条形码软件 项目的跟进。它展示了我们如何使用 Microsoft Silverlight 技术构建条形码软件应用程序。这个条形码软件的优点是您可以在支持 Silverlight 的任何浏览器中运行它。源代码至少需要 Visual Web Developer 2008 Express Edition 才能编译。

项目

该项目由两个 C# 子项目组成

(1) SilverlightBarcodeClassLibrary

此库源自 WPF 条形码软件项目的 Code39 条形码源代码。Barcodes 类的输入和输出属性以及方法几乎相同。为了方便起见,它们在下面重现

输入属性

  • BarcodeType - 现实生活中使用许多类型的条形码。例如,零售中使用的条形码与仓库和物流中使用的条形码不同。目前,条形码库实现了一种简单但广泛使用的条形码符号,称为 Code 39。此条形码也称为 Code 3 of 9。此条形码仅接受大写字母“A”到“Z”,数字“0”到“9”以及一些特殊字符。如果您在 Data 字符串中输入任何其他字符,它们将被忽略并过滤掉。
  • Code 39 条形码的优点是简单,因为每个字符都由 10 个交替的黑白条纹图案表示。但是,由于算法没有包含太多压缩,因此生成的条形码输出不是很密集。换句话说,对于短数据字符串,您会得到一个相当长的条形码。

  • Data - 这是要编码的数据。对于我们的 WPF 应用程序,我们使用“1234567”作为 Data 输入字符串。
  • CheckDigit - 一些条形码指定必须在条形码中包含校验位。校验位通常是附加到输入 Data 字符串并编码到条形码中的附加字符(或几个字符)。CheckDigit 帮助扫描仪验证其读取的数据是否正确和完整。对于 Code39 条形码,CheckDigit 是可选的。您可以指定 YesNo 来包含或排除它。

主方法

  • encode() - 指定输入属性后,您可以开始让条形码类创建黑白条纹。这是通过调用 encode() 方法来完成的。完成后,您可以使用 Barcodes 类的输出属性开始检索结果。

输出属性

  • EncodedData - 这是调用 encode() 方法后 Barcodes 返回的结果。EncodedData 以“twtwttwtttwtwttttwttwwttwtwttwttwtwttt”的形式返回一个字符串。“t”代表细条纹,“w”代表粗条纹。粗条纹的宽度通常是细条纹的三倍。
  • 解释结果的方法是每个字符指示交替的条纹颜色。例如,对于“twtw”,第一个“t”将是细黑条纹,第二个“w”将是粗白条纹,第三个“t”将是细黑条纹,第四个“w”将是粗白条纹。

    我们的 WPF 应用程序将使用 EncodedData 返回的字符串来绘制一系列交替的黑白矩形。

  • HumanText - 这是一段通常位于条形码下方的文本。HumanText 帮助人们在没有扫描仪的情况下读取条形码的内容。HumanText 通常与输入 Data 相同,但并非总是如此。有时,HumanText 会被格式化为特殊的开始/停止“*”字符;否则,它将包含额外的 CheckDigit。我们的 WPF 应用程序将使用 HumanText 返回的字符串来绘制条形码下方的可读文本。

(2) SilverlightBarcodeApplication - 一个 Silverlight 用户控件

该控件的布局主要由一个用于容纳条形码的 Canvas 和一个用于可读文本的 TextBlock 组成。TextBlock 的默认值为“1234”,它标记了条形码可读文本将位于的位置。条形码位于可读文本的正上方。围绕 CanvasTextBlock 的所有其余网格单元格都被视为条形码的静区——它们被故意留空,以便扫描仪不会将它们中的任何内容与实际条形码混淆。

以下是 Page.xaml 的源代码。将 ShowGridLines 设置为 True 以查看布局

<UserControl x:Class="SilverlightBarcodeApplication.Page"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        Width="270" Height="100" Loaded="UserControl_Loaded">
    <Grid x:Name="grdLayoutRoot" Background="White" Width="270" 
                Height="100" ShowGridLines="False">
        <Grid.RowDefinitions>
        <RowDefinition Height="10"></RowDefinition>
        <RowDefinition Height="50"></RowDefinition>
        <RowDefinition Height="30"></RowDefinition>
        <RowDefinition Height="10"></RowDefinition>
      </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
        <ColumnDefinition Width="10"></ColumnDefinition>
        <ColumnDefinition Width="250"></ColumnDefinition>
        <ColumnDefinition Width="10"></ColumnDefinition>
        </Grid.ColumnDefinitions>
      <Canvas x:Name="MyCanvas" Width="250" Height="50" 
                  Grid.Row="1" Grid.Column="1" />
         <TextBlock x:Name="MyText" Width="250" Height="30" Text="1234" 
           Grid.Row="2" Grid.Column="1"  TextAlignment="Center"  FontSize="16"/>
    </Grid>
</UserControl>

当控件加载时,条形码会在 UserControl_Loaded 方法中绘制。

步骤相当简单。控件首先使用条形码库返回一个表示条形码条纹的字符串(称为 encodedData)。根据 encodedData,它可以找到能够放入 Canvas 宽度的细条纹的总数。(顺便说一下,粗条纹的宽度是细条纹的三倍)。这个总数称为 encodedLength

然后,它通过将 Canvas 的宽度除以 encodedLength(细条纹的总数)来找到 WPF 坐标中最小条纹的宽度(称为 barWidth)。

float barWidth = (float)(this.MyCanvas.Width / encodedLength);

然后使用 barWidth 来绘制条形码的各个矩形。这样,我们就能够生成一个完全适合 Canvas 的条形码。

以下是 Usercontrol_Loaded 方法的源代码

private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
    Me.BarcodeSoftware.Barcode.Barcodes barcode = 
                       new Me.BarcodeSoftware.Barcode.Barcodes();
    barcode.BarcodeType = 
            Me.BarcodeSoftware.Barcode.Barcodes.BarcodeEnum.Code39;
    barcode.Data = "123456";
    barcode.encode();
    string encodedData = barcode.EncodedData;
    MyText.Text = barcode.HumanText;

    int encodedLength = 0;
    for (int x = 0; x < encodedData.Length; x++)
    {
        if (encodedData[x] == 't')
            encodedLength++;
        else if (encodedData[x] == 'w')
            encodedLength = encodedLength + 3;
    }

    float barWidth = (float)(this.MyCanvas.Width / encodedLength);

    if (barWidth < 1)
        barWidth = 1;
    float thickWidth = barWidth * 3;
    double incrementWidth = 0;

    int swing = 0;
    for (int x = 0; x < encodedData.Length; x++)
    {
        Brush brush;
        if (swing == 0)
            brush = new SolidColorBrush(Colors.Black);
        else
            brush = new SolidColorBrush(Colors.White);

        if (encodedData[x] == 't')
        {
            Rectangle r = new Rectangle();
            r.Fill = brush;
            r.Width = barWidth;
            r.Height = this.MyCanvas.Height;
            r.SetValue(Canvas.LeftProperty, incrementWidth);
            r.SetValue(Canvas.TopProperty, 0.0);
            MyCanvas.Children.Add(r);
            incrementWidth = incrementWidth + ((barWidth));
        }
        else if (encodedData[x] == 'w')
        {
            Rectangle r = new Rectangle();
            r.Fill = brush;
            r.Width = 3 * barWidth;
            r.Height = this.MyCanvas.Height;
            r.SetValue(Canvas.LeftProperty, incrementWidth);
            r.SetValue(Canvas.TopProperty, 0.0);
            MyCanvas.Children.Add(r);
            incrementWidth = incrementWidth + (3 * (barWidth));
        }

            if (swing == 0)
                swing = 1;
            else
                swing = 0;
        }
    }
}

My Silveright Barcode Software

进一步改进

源代码的进一步改进是覆盖控件的 OnRender 函数。有关此项目的更多更新,请访问我的 条形码软件 项目。

历史

  • 2009 年 5 月 1 日:v0.1 - 具有有限数量条形码的 WPF 条形码库。从 Code 39 条形码开始。
  • 2009 年 5 月 18 日:v0.2 - 我的 Silverlight 条形码软件是使用 WPF 条形码库相同的代码库构建的。
© . All rights reserved.