WPF 打票机的程序

来源:互联网 发布:小口径单发枪数据 编辑:程序博客网 时间:2024/05/29 08:52

    首先,感谢一下公司提供的一次WPF 开发机会.  这个项目也算是大部分完结了. 此次开发不涉及到数据库的搭建, 所以, 我省略了设计数据库这一块.  开始, 我搭建的解决方案目录从上到下依次为:  DBAccess , DBModel,Wpiao.BLL,Wpiao.TicketMachine;  是不是看得出来, 我的代码很不规则?  我经过总结我也渐渐发现我这一缺点.   严厉的自我反省才行.  继续吧.   DBAccess我是用来做以后的数据库链接的备用类库,DBModel 看着就知道, 放一般的对象模型类.   BLL 是放业务逻辑的. 最后一个是WPF界面.

       好了,   接下来要说的是, 用到那些方面的知识吧.

       这里先说BLL的几个重要类, 因为数据源都是从接口提供, 所以, 要提供一个(RequestPost)类,这个类的作用是POST或者GET请求接口,以string类型返回.  其中可能会涉及到一个返回数据量大的问题, 这样会引出timeout 问题. 但是, 目前还没发现有这个异常存在. 所以, 没做过多的处理.   毕竟打票机没有说有一次性几百M的打票数据去;    另外一个是转换JSON的类, (JsonHelper), 它这里是用到微软本身JSON转换的封装类库 System.Runtime.Serialization.Json; 其中包含序列化和反序列化. 还有的就是一个日志类(WriteLog),是用作日志记录的. 还有一个是(CacheHelper)缓存类, 是用户缓存访问接口的一些必要的数据信息,如Session同步,设置的超时时间是25分钟,超时了, 就进行重置Session.

       上述介绍了本项目的类库说明,下面说说WPF的一些知识点吧.

    一. WPF和WINFORM 区别

    新建的窗体并不是Form, 而是 Window, Form是以cs后缀,启动入口是program.cs ;而WPF是以xaml,  启动入口是App.xaml ;  如下图代码;

<Application x:Class="Wpiao.TicketMachine.App"             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"             StartupUri="MainWindow.xaml"></Application>
  StartupUri 是修改启动程序入口的地方;  Winform 的控件是可以在WPF 用的. 只不过, 样式调整会比较麻烦而已.

   二. WPF 的布局

        很多都是直接根据相应的分辨率进行布局的. 如果你说要兼容到很多不同分辨率的显示器,   第一个就要做到布局不乱的问题. 这个我目前没有太多这方面的经验. 目前我想到的是,  有部分控件的布局位置,得根据代码来实现; 我那打票机是根据1280* 1024的分辨率进行实现的.  我常用的是Grid和Border, 如果你想用StackPanel   也不是不可以. 只是我个人用不习惯.两者的作用如下(百度得来的):

Grid是以表格的方式定位子元素。可以定义行和列,然后将元素布局到表格当中。类似于Html中的Table元素。StackPanel是以水平或者竖直方向对子元素进行排列。相当于Android中的LinearLayout,或者是JavaGUI中的FlowLayout。

我上面说我喜欢用Grid,可能才刚开始接触, 所以就喜欢了. 为啥Border和Grid呢?因为它可以使Grid变成圆角,网上很少有说到相关的Grid怎么弄成圆角的.  其实,   我也走了挺多弯路, 在此,  我废话不多说. 我先贴代码出来吧.

 <Window x:Class="Wpiao.TicketMachine.ShowTipWin"        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"        Height="300" Width="500" WindowState="Normal"  AllowsTransparency="True"  ResizeMode="NoResize"  BorderBrush="Transparent" Background="Transparent" OpacityMask="White"   WindowStyle="None"  Loaded="Window_Loaded" WindowStartupLocation="CenterScreen"  Margin="0" Padding="0">    <Window.Resources>        <ResourceDictionary>            <ResourceDictionary.MergedDictionaries>                <ResourceDictionary Source="WinResource.xaml"></ResourceDictionary>            </ResourceDictionary.MergedDictionaries>        </ResourceDictionary>    </Window.Resources>    <Grid  >        <Border  BorderThickness="1"   Background="White" CornerRadius="10">         </Border>        <Grid   >            <Border  CornerRadius="8" BorderThickness="0" Height="61" VerticalAlignment="Top" Background="#FF51BD4C" HorizontalAlignment="Left" Width="498" Margin="1,1,0,0">                <Label Content="文化惠温馨提示" FontSize="24" HorizontalAlignment="Left" Height="55" VerticalContentAlignment="Center" VerticalAlignment="Top"  HorizontalContentAlignment="Center" Width="194" BorderBrush="#FFE2D4D4" Foreground="White" Background="{x:Null}" FontFamily="STKaiti" Margin="2,1,0,0"/>            </Border>            <TextBox   Text="" x:Name="lbcontent"  BorderThickness="0"  FontWeight="Bold" Foreground="Red" VerticalContentAlignment="Center" HorizontalContentAlignment="Center"  TextWrapping="Wrap"  HorizontalAlignment="Left" Margin="29,87,0,0" FontSize="18"  VerticalAlignment="Top" Height="98" Width="440"/>            <Button Content="确定"   Style="{StaticResource xComButton}"  Foreground="White"   HorizontalAlignment="Left" Margin="175,209,0,0" FontSize="24" VerticalAlignment="Top" Width="135" Height="62" Click="Button_Click" Background="#FF36C52F">            </Button>        </Grid>    </Grid></Window>

先把窗体设置成透明背景 Background="Transparent" , 然后,Grid 嵌套一个Border,  Border的子元素只能只有一个,这个我也不知道为啥, 微软定义的规则.  将Border设置成CornerRadius="10"的圆角. 然后再Border里面再嵌套一个Grid, 来放置内容.

上面的代码里面又可以延伸到另外一个问题,  注意到红色的字体没有? 这是一个静态样式的引用, 其实是为了让button也变圆角.  这个因为时间问题, 我这里不多说了哈.

  三.分屏技术

其中用到分屏技术,先 System.Windows.Forms.Screen.AllScreens[index],  Index的类型是int,  0 代表着主屏, 1   代表副屏,  然后, 再根据    Screen对象进行区域划分Rectangle r1 = s0.WorkingArea; 将 r1 的宽高赋值到 窗体的宽高后再show()一下窗体即可.


  四.其他
     其他的一些就是很零散的.   比如, WPF的倒计时类并不是timer,    而是,  DispatcherTimer timer = new DispatcherTimer();    设置它的隔多少秒  timer.Interval = TimeSpan.FromMilliseconds(1000);执行一次 Tick+=你的方法();然后就可以start().


第一次写那么多字, 瞬间觉得好累又满足. 哈哈~~新人博客, 还望大神别扔砖头!





0 0