我的 Silverlight 条形码软件
Silverlight 中的条形码软件应用程序。
引言
这是对 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
字符串中输入任何其他字符,它们将被忽略并过滤掉。Data
- 这是要编码的数据。对于我们的 WPF 应用程序,我们使用“1234567”作为Data
输入字符串。CheckDigit
- 一些条形码指定必须在条形码中包含校验位。校验位通常是附加到输入Data
字符串并编码到条形码中的附加字符(或几个字符)。CheckDigit
帮助扫描仪验证其读取的数据是否正确和完整。对于 Code39 条形码,CheckDigit
是可选的。您可以指定Yes
或No
来包含或排除它。
Code 39 条形码的优点是简单,因为每个字符都由 10 个交替的黑白条纹图案表示。但是,由于算法没有包含太多压缩,因此生成的条形码输出不是很密集。换句话说,对于短数据字符串,您会得到一个相当长的条形码。
主方法
encode()
- 指定输入属性后,您可以开始让条形码类创建黑白条纹。这是通过调用encode()
方法来完成的。完成后,您可以使用Barcodes
类的输出属性开始检索结果。
输出属性
EncodedData
- 这是调用encode()
方法后Barcodes
返回的结果。EncodedData
以“twtwttwtttwtwttttwttwwttwtwttwttwtwttt”的形式返回一个字符串。“t”代表细条纹,“w”代表粗条纹。粗条纹的宽度通常是细条纹的三倍。HumanText
- 这是一段通常位于条形码下方的文本。HumanText
帮助人们在没有扫描仪的情况下读取条形码的内容。HumanText
通常与输入Data
相同,但并非总是如此。有时,HumanText
会被格式化为特殊的开始/停止“*”字符;否则,它将包含额外的CheckDigit
。我们的 WPF 应用程序将使用HumanText
返回的字符串来绘制条形码下方的可读文本。
解释结果的方法是每个字符指示交替的条纹颜色。例如,对于“twtw”,第一个“t”将是细黑条纹,第二个“w”将是粗白条纹,第三个“t”将是细黑条纹,第四个“w”将是粗白条纹。
我们的 WPF 应用程序将使用 EncodedData
返回的字符串来绘制一系列交替的黑白矩形。
(2) SilverlightBarcodeApplication - 一个 Silverlight 用户控件
该控件的布局主要由一个用于容纳条形码的 Canvas
和一个用于可读文本的 TextBlock
组成。TextBlock
的默认值为“1234”,它标记了条形码可读文本将位于的位置。条形码位于可读文本的正上方。围绕 Canvas
和 TextBlock
的所有其余网格单元格都被视为条形码的静区——它们被故意留空,以便扫描仪不会将它们中的任何内容与实际条形码混淆。
以下是 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;
}
}
}
进一步改进
源代码的进一步改进是覆盖控件的 OnRender
函数。有关此项目的更多更新,请访问我的 条形码软件 项目。
历史
- 2009 年 5 月 1 日:v0.1 - 具有有限数量条形码的 WPF 条形码库。从 Code 39 条形码开始。
- 2009 年 5 月 18 日:v0.2 - 我的 Silverlight 条形码软件是使用 WPF 条形码库相同的代码库构建的。