WPF 打票机的程序

    首先,感谢一下公司提供的一次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().


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





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值