使用WPF动态生成Code 39条形码

摘要:
最近在看些条形码方面相关的资料,而如果只是看的话,效果似乎并不怎么好,所以决定动手做点Demo,以增强对相关知识的记忆。这里是一个我编写的使用WPF生成Code39的例子,Code39的编码很简单,故而第一次先用它做为尝试。标准的Code39只支持43个字符,0~9,A~Z,-,.,$,/,+,%以及空格。由于是WPF,Demo分为两个文件,xaml文件包含界面布局相关的代码:15678910111213xaml.cs文件是具体的实现,主要功能是在文本框内容改变的时候动态构成Code39条形码:1usingSystem.Collections.Generic;2usingSystem.Text;3usingSystem.Text.RegularExpressions;4usingSystem.Windows;5usingSystem.Windows.Controls;6usingSystem.Windows.Media;7usingSystem.Windows.Shapes;89namespaceCode39Demo10{11///12///InteractionlogicforMainWindow.xaml13///14publicpartialclassMainWindow:Window15{16publicMainWindow()17{18InitializeComponent();19}2021privatevoidWindow_Loaded22{23Textbox1.Focus();24}2526privatevoidTextbox1_TextChanged27{28Canvas1.Children.Clear();2930TextBoxtextBox=e.SourceasTextBox;31if(textBox!

最近在看些条形码方面相关的资料,而如果只是看的话,效果似乎并不怎么好,所以决定动手做点Demo,以增强对相关知识的记忆。

这里是一个我编写的使用WPF生成Code 39的例子,Code 39的编码很简单,故而第一次先用它做为尝试。

标准的Code 39只支持43个字符,0~9,A~Z,-,.,$, /, +, %以及空格。除此之外,*用于起始和终止符号。而通过使用两个编码符的扩展,则可以支持所有的Acsii码字符。相关知识可以在维基百科上找到。

由于是WPF,Demo分为两个文件,xaml文件包含界面布局相关的代码:

1     <Window x:Class="Code39Demo.MainWindow"  
2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
4 Title="MainWindow"Height="350"Width="525"Loaded="Window_Loaded">  
5         <Grid>  
6             <Grid.RowDefinitions>  
7                 <RowDefinition></RowDefinition>  
8                 <RowDefinition></RowDefinition>  
9             </Grid.RowDefinitions>  
10             <TextBox Name="Textbox1"VerticalContentAlignment="Center"TextChanged="Textbox1_TextChanged"></TextBox>  
11             <Canvas Name="Canvas1"Grid.Row="1"></Canvas>  
12         </Grid>  
13     </Window>  

xaml.cs文件是具体的实现,主要功能是在文本框内容改变的时候动态构成Code 39条形码:

1     usingSystem.Collections.Generic;  
2     usingSystem.Text;  
3     usingSystem.Text.RegularExpressions;  
4     usingSystem.Windows;  
5     usingSystem.Windows.Controls;  
6     usingSystem.Windows.Media;  
7     usingSystem.Windows.Shapes;  
8        
9     namespaceCode39Demo  
10 {  
11         /// <summary>  
12         ///Interaction logic for MainWindow.xaml  
13         /// </summary>  
14         public partial classMainWindow : Window  
15 {  
16             publicMainWindow()  
17 {  
18 InitializeComponent();  
19 }  
20        
21             private void Window_Loaded(objectsender, RoutedEventArgs e)  
22 {  
23 Textbox1.Focus();  
24 }  
25        
26             private void Textbox1_TextChanged(objectsender, TextChangedEventArgs e)  
27 {  
28 Canvas1.Children.Clear();  
29        
30                 TextBox textBox = e.Source asTextBox;  
31                 if (textBox != null)  
32 {  
33                     string content =textBox.Text;  
34                     if (string.IsNullOrEmpty(content))  
35 {  
36                         textBox.BorderBrush = null;  
37                         return;  
38 }  
39        
40                     string code = string.Empty;  
41                     bool result = TryConvertCode(content, outcode);  
42                     if (!result)  
43 {  
44                         textBox.BorderBrush = newSolidColorBrush(Colors.Red);  
45                         textBox.BorderThickness = new Thickness(2);  
46                         return;  
47 }  
48                     else  
49 {  
50                         textBox.BorderBrush = null;  
51 }  
52        
53                     int thinWidth = 3;  
54                     int thickWidth = 3 *thinWidth;  
55                     int currentPos = 10;  
56        
57                     for (int i = 0; i < code.Length; i++)  
58 {  
59                         Rectangle r = newRectangle();  
60                         r.Height = 150;  
61        
62 Canvas.SetLeft(r, currentPos);  
63        
64                         switch(code[i])  
65 {  
66                             case 'N':  
67 {  
68                                     r.Fill = newSolidColorBrush(Colors.Black);  
69                                     currentPos +=thinWidth;  
70                                     r.Width =thinWidth;  
71                                     break;  
72 }  
73                             case 'n':  
74 {  
75                                     r.Fill = newSolidColorBrush(Colors.White);  
76                                     currentPos +=thinWidth;  
77                                     r.Width =thinWidth;  
78                                     break;  
79 }  
80                             case 'W':  
81 {  
82                                     r.Fill = newSolidColorBrush(Colors.Black);  
83                                     currentPos +=thickWidth;  
84                                     r.Width =thickWidth;  
85                                     break;  
86 }  
87                             case 'w':  
88 {  
89                                     r.Fill = newSolidColorBrush(Colors.White);  
90                                     currentPos +=thickWidth;  
91                                     r.Width =thickWidth;  
92                                     break;  
93 }  
94 }  
95        
96 Canvas1.Children.Add(r);  
97 }  
98 }  
99 }  
100        
101             private bool TryConvertCode(string content, out stringcode)  
102 {  
103                 code = string.Empty;  
104                 string c = "*" + content + "*";  
105                 StringBuilder sb = newStringBuilder();  
106        
107                 for (int i = 0; i < c.Length; i++)  
108 {  
109                     string value = string.Empty;  
110                     bool result = _code39Map.TryGetValue(c[i], outvalue);  
111                     if (!result)  
112 {  
113                         return false;  
114 }  
115        
116 sb.Append(value);  
117                     sb.Append('n');  
118 }  
119        
120                 code = sb.Remove(sb.Length - 1, 1).ToString();  
121        
122                 return true;  
123 }  
124        
125             private static Dictionary<char, string> _code39Map = new Dictionary<char, string>();  
126        
127             staticMainWindow()  
128 {  
129                 _code39Map['0'] = "NnNwWnWnN";  
130                 _code39Map['1'] = "WnNwNnNnW";  
131                 _code39Map['2'] = "NnWwNnNnW";  
132                 _code39Map['3'] = "WnWwNnNnN";  
133                 _code39Map['4'] = "NnNwWnNnW";  
134                 _code39Map['5'] = "WnNwWnNnN";  
135                 _code39Map['6'] = "NnWwWnNnN";  
136                 _code39Map['7'] = "NnNwNnWnW";  
137                 _code39Map['8'] = "WnNwNnWnN";  
138                 _code39Map['9'] = "NnWwNnWnN";  
139                                               
140                 _code39Map['A'] = "WnNnNwNnW";  
141                 _code39Map['B'] = "NnWnNwNnW";  
142                 _code39Map['C'] = "WnWnNwNnN";  
143                 _code39Map['D'] = "NnNnWwNnW";  
144                 _code39Map['E'] = "WnNnWwNnN";  
145                 _code39Map['F'] = "NnWnWwNnN";  
146                 _code39Map['G'] = "NnNnNwWnW";  
147                 _code39Map['H'] = "WnNnNwWnN";  
148                 _code39Map['I'] = "NnWnNwWnN";  
149                 _code39Map['J'] = "NnNnWwWnN";  
150                 _code39Map['K'] = "WnNnNnNwW";  
151                 _code39Map['L'] = "NnWnNnNwW";  
152                 _code39Map['M'] = "WnWnNnNwN";  
153                 _code39Map['N'] = "NnNnWnNwW";  
154                 _code39Map['O'] = "WnNnWnNwN";  
155                 _code39Map['P'] = "NnWnWnNwN";  
156                 _code39Map['Q'] = "NnNnNnWwW";  
157                 _code39Map['R'] = "WnNnNnWwN";  
158                 _code39Map['S'] = "NnWnNnWwN";  
159                 _code39Map['T'] = "NnNnWnWwN";  
160                 _code39Map['U'] = "WwNnNnNnW";  
161                 _code39Map['V'] = "NwWnNnNnW";  
162                 _code39Map['W'] = "WwWnNnNnN";  
163                 _code39Map['X'] = "NwNnWnNnW";  
164                 _code39Map['Y'] = "WwNnWnNnN";  
165                 _code39Map['Z'] = "NwWnWnNnN";  
166                                               
167                 _code39Map['-'] = "NwNnNnWnW";  
168                 _code39Map['.'] = "NwNnNnWnW";  
169                 _code39Map[' '] = "NwWnNnWnN";  
170                 _code39Map['$'] = "NwNwNwNnN";  
171                 _code39Map['/'] = "NwNwNnNwN";  
172                 _code39Map['+'] = "NwNnNwNwN";  
173                 _code39Map['%'] = "NnNwNwNwN";  
174                                               
175                 _code39Map['*'] = "NwNnWnWnN";  
176 }  
177 }  
178     }  

各字符对应编码中,W表示黑色宽条,w表示白色宽条,N表示黑色窄条,n表示白色窄条。需要注意的是,Code 39的相邻字符间需要有一个白色窄条用于分隔。

这个Demo还欠缺Code 39中校验码的处理(通常不需要),如果有需要的话,可以在此基础上补充,相信并不是困难的工作。

原文同步发布于我的个人博客

免责声明:文章转载自《使用WPF动态生成Code 39条形码》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Adobe Acrobat Pro DC破解django-Ajax发送POST请求-csrf跨站请求的三种方式下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

WPF: 在ListView中添加Checkbox列表

描述:ListView是WPF中动态绑定工具的数据容器,本文实现了一个在ListView中显示的供用户选择的列表项目,并且控制列表中选择的项目数量,即实现单选。 XAML中创建ListView,代码如下: <ListView x:Name="listView_LineOfBusiness" Width="280" Height="220">...

WPF ScrollViewer嵌套的DataGrid、ListBox等控件的鼠标滚动事件无效,子控件拦截父控件滚动效果解决办法

注册子控件的PreviewMouseWheel,然后在滚动的时候设置控件的 IsHitTestVisible = false,因为这个参数设为false之后子控件里面的TextBox,CheckBox会失效,所以在停止滚动后要把参数设回来。代码如下 private void girdOrder_PreviewMouseWheel(object sende...

WPF基于Live Charts实现波形图

using LiveCharts;//livecharts.netusing LiveCharts.Wpf;using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;using System.Threadi...

WPF 自定义滚动条样式

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" > <Re...

WPF中RadioButton绑定数据的正确方法

RadioButton一般用于单选的时候,也就是从一组值中选择一个值。 比如性别有“男”和“女”两种取值,而对于一个员工的实例来说,性别的取值要么是男,要么是女。 这种时候一般就会用到RadioButton。 RadioButton有一个IsChecked属性用于表示是否选中,IsChecked属性的值类型是bool,只能直接绑定bool类型的值。 然而对...

WPF数据模板样式选择器

在使用数据模板样式选择器时,不能设置ItemContainerStyle的属性值,如果设置了该值,那么数据模板样式选择器会失去作用。 在使用数据模板样式选择器时,首先要创建数据模板样式选择器对象,此对象要重写StyleSelector基类的SelectStyle方法,并在方法中返回相应的样式,CS代码如下: public class ListViewI...