0%

SQLCE是微软开发的微型数据库,主要用于CE,WP之类的掌上设备。 先去微软件下载Microsoft SQL Server Compact Edition,安装,项目添加引用System.Data.SqlServerCe. 使用代码:

            SqlCeConnection conn = null;
            //SqlCeEngine engine = new SqlCeEngine("Data Source = db.sdf");
            //engine.CreateDatabase();
            //上面是创建数据库
            conn = new SqlCeConnection("Data Source = db.sdf");
            //连接
            conn.Open();
            //打开
            SqlCeCommand cmd = conn.CreateCommand();
            cmd.CommandText = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='train';";
           //执行SQL
            SqlCeDataReader sdr = cmd.ExecuteReader();
            
            /*循环读取数据方法
            while (sdr.Read())
            {
                Console.WriteLine(sdr.GetString(0));
            }
             * */


            if (sdr.FieldCount > 0)
            {
                cmd.CommandText = "DROP TABLE train;";
                cmd.ExecuteNonQuery();
            }
            //如果表train已经存在,则删除
            sdr.Close();
            //关闭DataReader
           
            conn.Close();
            //关闭连接

创建的数据库db.sdf是存放在Debug目录下的

学习WP7开发以来写的第一个实用程序,采用离线数据库,不消耗您1B的流量。当前数据是2011.10.06最新版,含4206次列车信息,可以站站查询,车次查询。 2011.12.14 1.2版: 1、更新到2011.12.12数据库 2、站站查询车次列车按时间排序 3、红色显示站站查询的起点站和终点站 4、查询输入框自动保存上次查询纪录 5、修复关屏后回来,无法再查询的BUG 6、修复车次查询部分车次无法查到的BUG 7、修复列车详情车次过长无法全部显示的BUG(可左右滚动) 10月11日 1.1版: 优化查询速度,站站查询一般进度条只需要转一圈。 修复出站时间与到站时间颠倒BUG 10月9日 1.0版: 第一版发布 下载(解压后用XAP安装工具安装): 1.2: http://dl.dbank.com/c08rsulxpe 1.1: [download id=”30”] 1.0: [download id=”28”]

在模拟器上调试不会报错,但是真机调试的时候,就提示Application could not be launched for debugging ,其实程序已经安装进手机,只是无法自动启动。网上搜索也找不到相应的解决方法,说是把SplashScreenImage.jpg的生成操作设为内容,但我根本 就没替换这文件,本来就是内容。我是在升级到7720时出现的问题,原来好像是7712?忘了,反正是以前测试版的芒果,一直没问题。没办法,试着回滚到7004,再重新越狱,升级到7720,现在已经可以正常调试。其实也不算是解决办法,但目前好像也没什么其他方法可以解决,只有如此,我估计是之前刷过测试版有影响。

WP7本身不支持Sqlite数据库,但我们可以添加第三方组件让它支持Sqlite. 首先在项目中添加引用Community.CsharpSqlite.WP.dll,我会放后面让大家下载,我下了有几天了,是源码,我也找不回原网址了,所以就编译了一下,直接引用就可以了. 另外,原版在使用从外部添加的数据库时(即不是在程序中生成的数据库),会提示”Unable open the database”,我改了一下,已经解决该问题.经测试,不支持like语法,就是不支持模糊查询,这个有点郁闷。 解决方法:打开os_win_c.cs,找到第795行:

pFile.fs = new IsolatedStorageFileStream(zConverted, dwCreationDisposition, dwDesiredAccess, dwShareMode, store);

替换为:

pFile.fs = new IsolatedStorageFileStream(zConverted, FileMode.OpenOrCreate, dwDesiredAccess, dwShareMode, store);

下面说说具体的使用方法,只详细介绍select读取数据,其他的没有返回,很简单. 假设数据库为db.db,表为station,字段为station_name. 执行Sql后,返回的是一个枚举类型,我们要先定义一个存放返回数据的类:

    public class Train
    {
        public Train() { }

        string _name;
        public string station_name
            //属性名必须与列名相同
        {
            get { return _name; }
            set { _name = value; }
        }

    }

因为只读station_name,所以只有一个属性. 读取数据库并显示在ListBox上:

            SQLiteConnection db = new SQLiteConnection("db.db");
            //连接数据库,如果不存在,会自动创建,我事先已经拷了一个进去,所以可以下面的select操作
            //数据库是使用IsolatedStorageFile存取的,可以使用IsolatedStorageFile复制,删除等
            db.Open();
            //打开数据库
            SQLiteCommand cmd=db.CreateCommand("select station_name from station limit 100");
            IEnumerable lst = cmd.ExecuteQuery();
            //返回Train类型的枚举
            //非select语句,使用cmd.ExecuteNonQuery();
            List s = new List();
            
            foreach (Train o in lst)
            {
                s.Add(o.station_name);
            }
            listBox1.ItemsSource = s;
            //显示在ListBox上
            
            db.Dispose();
            db = null;
            //释放资源

ListBox的SelectedItem属性返回的是Train类的实例,但需要强制转换:

Train train=(Train)listBox1.SelectedItem;

Community.CsharpSqlite.WP.dll下载: [download id=”27”]

代码简单,只为方便以后查询,不作注释

            Regex r = new Regex("www.([^\\.]+).com"); 
            string s = "afsasfwww.pocketdigi.comasdfasdfsa";
            MatchCollection mc = r.Matches(s);
            for (int i = 0; i < mc.Count; i++) 
            {
                GroupCollection gc = mc[i].Groups; 
                Console.WriteLine(gc[0]);
                Console.WriteLine(gc[1]);
                s = s.Replace(gc[0].ToString(), "正则替换");
                Console.WriteLine(s);

            }

这篇文章其实主要是介绍数据绑定,所以ListBox那些初级的最简单的使用方法,直接跳过,那个用Visual Studio点点鼠标就可以实现. 数据绑定,就是将C#数据类型或是UI里控件的属性值,同步到UI里的一个或多个控件的属性值. 举个例子,比如一个TextBlock,它的Text属性值不是固定的,值取决于另一个控件TextBox的Text属性,只要TextBox的Text属性发生变化,TextBlock的Text属性就会自动同步改变,效果相当于给TextBox加了TextChanged事件,然后实时改变TextBlock的Text属性. 首先是多个UI控件之间的绑定方法:

<TextBlock Height="49" HorizontalAlignment="Left" Margin="24,381,0,0" Name="textBlock1" Text="{Binding ElementName=textBox1,Path=Text}" VerticalAlignment="Top" Width="316" />
<TextBox Height="72" HorizontalAlignment="Left" Margin="12,303,0,0" Name="textBox1" Text="TextBox" VerticalAlignment="Top" Width="460" />

关键在于TextBlock控件的Text属性设置,ElementName即是数据源对象名,Path即该对象的属性,这里的意思就是textBlock1的Text属性等于textBox1的Text属性值.绑定以后,textBlock1的Text属性会随着textBox1的Text属性的改变实时更新. 接着是UI控件绑定C#类的方法,以ListBox为例: 我这里分两个例子,一个是最简单的显示一个TextBlock,另一个是稍稍复杂的显示图片与文本. 只显示文本:

<ListBox Height="100" HorizontalAlignment="Left" Margin="-10,6,0,0" Name="listBox1" VerticalAlignment="Top" Width="460" ItemsSource="{Binding}"></ListBox>
//ItemsSource="{Binding}"

C#代码:

string[] s = new string[] { "af","wdfsa","xcvfddsf"};
listBox1.ItemsSource = s;

上面的例子就是把string数组绑定到ListBox上. 接着是复杂的,加上图片: 我们需要先写个类来保一条item的数据,我这里是Car类

namespace PhoneApp1
{
    public class Car
    {
        public string Name { get; set; }
        public BitmapImage Pic { get; set; }
    }

}

Name 名,Pic 图片 在XAML里增加命名空间:

xmlns:My="clr-namespace:PhoneApp1"

PhoneApp1即项目的默认命名空间. 新增资源引用(好像可以省略):

    <phone:PhoneApplicationPage.Resources>
        <My:Car x:Key="myCar"></My:Car>
    </phone:PhoneApplicationPage.Resources>

ListBox绑定数据:

            <ListBox  Height="100" HorizontalAlignment="Left" Margin="0,0,0,348" Name="listBox2" VerticalAlignment="Bottom" Width="460" >
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <Grid Margin="0,0,0,0" HorizontalAlignment="Left" VerticalAlignment="Center">
                            <Image Name="Pic"  Width="auto" Height="60" Source="{Binding Path=Pic}" HorizontalAlignment="Left" VerticalAlignment="Center"></Image>
                            <TextBlock Margin="90,0,0,0" Name="Text" Width="60" Height="30" Text="{Binding Name}" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
                        </Grid>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>

自定义了一个Item模板,一个Image控件,一个TextBlock控件,分别对Source和Text属性进行绑定. 下面是C#程序中添加Item的代码:

            List carList = new List();
            Car car1 = new Car();
            car1.Name = "Car1";
            BitmapImage myImage = new BitmapImage(new Uri("/PhoneApp1;component/Images/a.jpg", UriKind.Relative));
            car1.Pic = myImage;

            Car car2 = new Car();
            car2.Name = "Car2";
            myImage = new BitmapImage(new Uri("/PhoneApp1;component/Images/b.jpg", UriKind.Relative));
            car2.Pic = myImage;

            Car car3 = new Car();
            car3.Name = "Car3";
            myImage = new BitmapImage(new Uri("/PhoneApp1;component/Images/c.jpg", UriKind.Relative));
            car3.Pic = myImage;

            carList.Add(car1);
            carList.Add(car2);
            carList.Add(car3);
            listBox2.ItemsSource = carList;

图片abc事先添加进Images目录. 上个效果图: 源码打包,原图片太大,我换了几张小图,是bmp格式的,所以源码中图片后缀不同: [download id=”26”]

ApplicationBar就是显示在程序底部的一个菜单,其实Visual Studio在建立XAML时就已经默认给我们加上了,只不过注释掉了而已,就是最底下被注释的那段.取消注释后:

    <phone:PhoneApplicationPage.ApplicationBar>
        <shell:ApplicationBar IsVisible="True" IsMenuEnabled="True">
            <shell:ApplicationBarIconButton IconUri="/Images/appbar.cancel.rest.png" Text="按钮一" Click="ApplicationBarIconButton_Click"></shell:ApplicationBarIconButton>
            <shell:ApplicationBarIconButton IconUri="/Images/appbar.check.rest.png" Text="按钮一" Click="ApplicationBarIconButton_Click_1"></shell:ApplicationBarIconButton>
            <!---添加图标-->
            <shell:ApplicationBar.MenuItems>
                <shell:ApplicationBarMenuItem Text="MenuItem 1" Click="ApplicationBarMenuItem_Click" />
                <shell:ApplicationBarMenuItem Text="MenuItem 2"/>
            </shell:ApplicationBar.MenuItems>
            <!---添加item-->
        </shell:ApplicationBar>
    </phone:PhoneApplicationPage.ApplicationBar>

我在程序中自己添加了点击事件,两张按钮的图片需要先添加进Images目录,属性-生成操作设为内容.图标最多只能有4个,但下面的item没有限制

WP7中,控件的Style属性功能有点类似于CSS,定义一个样式,任何指定的控件都可以通过设定Style属性为定义的样式名,来实现多个控件同一样式. 首先,定义一个Style:

    <phone:PhoneApplicationPage.Resources>
        <Style x:Key="myStyle" TargetType="Button">
            <!---限定为Button的样式,名为myStyle-->
            <Setter Property="BorderBrush" Value="Aqua"></Setter>
            <Setter Property="Foreground" Value="Red"></Setter>
            <!--设置边框与前景色-->
        </Style>
    </phone:PhoneApplicationPage.Resources>

如果只在单一页面使用,上面的代码写在该页面即可,如果整个程序都要调用,写在App.xaml. 在控件中调用:

<Button Content="Zoom In" Height="72" HorizontalAlignment="Left" Margin="52,405,0,0" Name="button2" VerticalAlignment="Top" Width="160" Click="button2_Click" Style="{StaticResource myStyle}"></Button>

Image控件可以让我们在程序中显示一张指定的图片. XAML代码添加控件:

<Image Height="244" HorizontalAlignment="Left"  Name="image1" Stretch="Uniform" VerticalAlignment="Top" Width="330" Source="/Test;component/Images/Koala.jpg" />

Source指定的是相对路径/Images目录下的Koala.jpg文件,可以选中Image控件,在属性的Source后点”…”按钮图形化添加硬盘上的图片,Visual Studio会自动把选中的图片添加进项目. Stretch属性是设定图片的显示方法: 值None为按图片自身分辨率显示,如果Image控件的宽度或高度小于图片的宽度或高度,超出的部分就看不到了. 值Fill指用拉伸的方式填满Image控件. 值Uniform是指按原图片的宽高比例,适应Image控件的宽或高,以达到Image控件宽高中较小值为准(除去图片宽高比例),所以,总是能全部显示图片 值UniformToFill是指按原图片的宽高比例,适应Image控件的宽或高,但是以达到Image控件宽高中较大值为准(除去图片宽高比例),所以,只有当Image控件的宽高比例与图片相同时,才能完整显示图片. 后面两个值表达得不是很清楚,自己试试就知道了. C#代码中修改显示的图片:

BitmapImage myImage=new BitmapImage(new Uri("/Test;component/Images/car.jpg",UriKind.Relative));
//可以使用BitmapImage myImage = new BitmapImage(new Uri("http://img04.taobaocdn.com/tps/i4/T140KqXgRgXXXXXXXX-152-202.jpg", UriKind.Absolute));
//的形式来显示网络图片,UriKind指的是Uri的类别,相对路径或绝对路径
image1.Source=myImage;

图片的缩放. 图片的缩放,把显示的显示方式设为Uniform,再同时把Image的Height和Width属性乘以同一个值就可以了,放大就大于1,缩小就小于1.但是如果直接这么操作,手机屏幕很小,很可能会无法显示图片的一部分.我们可以把Image控件放进ScrollView里来解决,这样,我们就可以在屏幕上上下左右拖动来浏览图片.

 <ScrollViewer Height="298" Width="387" Margin="52,75,29,234" VerticalScrollBarVisibility="Visible" HorizontalScrollBarVisibility="Visible">
    <Image Height="239" HorizontalAlignment="Left"  Name="image1" Stretch="Uniform" VerticalAlignment="Top" Width="322" Source="/Test;component/Images/Koala.jpg" />
 </ScrollViewer>

放大缩小代码:

        private void button2_Click(object sender, RoutedEventArgs e)
        {
            image1.Width *= 1.2;
            image1.Height *= 1.2;
        }

        private void button3_Click(object sender, RoutedEventArgs e)
        {
            image1.Width *= 0.8;
            image1.Height *= 0.8;
        }

其实,在TextBlock里,是没有滚动条相关属性的,就是说我们不能直接给TextBlock添加一个滚动条,但是我们可以把TextBlock放进ScrollViewer里,来实现滚动条的效果.

            <ScrollViewer Height="131" HorizontalAlignment="Left" Margin="103,122,0,0" Name="scrollViewer1" VerticalAlignment="Top" Width="252" VerticalScrollBarVisibility="Visible">
                <ScrollViewer.Content>
                    <TextBlock Height="466" Name="textBlock1" Text="TextBlock" Width="221" TextWrapping="Wrap" />
                </ScrollViewer.Content>
             </ScrollViewer>

VerticalScrollBarVisibility属性设置垂直滚动条,Visible即显示,还有Disable禁用 Auto 自动 Hidden 隐藏几个值,水平滚动条是HorizontalScrollBarVisibility.可以看到,在ScrollViewer里的TextBlock高度要比ScrollViewer高很多,这是因为这个滚动条是ScrollViewer的,并不是TextBlock的,TextBlock还是要有足够的高度显示所有的内容(其实设设置成Auto就可以了).其他没有滚动条属性的控件也可以通过这个方法实现滚动条效果.