posts - 11,  comments - 7,  trackbacks - 0
公告
  2012年2月17日
MetroUI的介绍
Metro的灵感来自于机场和地铁的指示牌,其风格大量采用大字体,吸引人们的注意力。微软认为Metro的设计主题应该是“光滑、快、现代”。

五原则的解释:
1.简洁——极强的视觉冲击力,减少画面杂乱感。
2.内容——着重于用户关心的内容(大字体)
3.软硬结合——方便搜索,启动相机(硬件上的统一)
4.世界级的动画——Toolkit封装了大量常用的动画
5.热情与活力——很Geek有木有?

全景视图的介绍:
它是选项,导航和数据的多屏幕滚动菜单。
全景视图最酷的一个特色就是可以用一张很大的图片当做背景,它比其余的内容滚动的要慢,效果很绚丽。但是很消耗内存。同时不推荐在全景视图中进行输入操作。

WP7程序可以实现目标:
1.个人——你的生活、你的生活方式

2.关联——你的社群、你的领域

3.连接——你的事物、你的心灵
每个程序只是奥与上述任何一个目标有所关联。

关于多任务
7.0以前
微软不允许任何第三方应用程序在WP7的后台运行,特定时间内只允许有一个程序在前台运行。如果我们不是OEM厂商的话,我们只有墓碑可以用,第三方应用开发者只能利用墓碑和Push机制来尽力模拟一个伪多任务的效果,但这样一来却极大的限制了应用的功能。
墓碑机制
它是WinPhone7中的一个程序运行规则。简单来说就是当手机上一个任务被迫中断时(如有电话打入),像把事件记录在墓碑上,系统记录下当前应用程序的状态,然后中止程序。当需要恢复时,根据墓碑上的内容,将程序恢复到中断之前的状态。

比如玩游戏的时候突然有电话接入,因为WP7不运行有多个任务在前台,所以这时我们的游戏程序就已经死了,但是一块墓碑上记载了它临终前的所有状态。当通话结束后,操作系统将游戏重新启动,并将墓碑上的状态数据传递给应用程序进行恢复,相当于应用从墓地里爬起来,原地满状态复活。

在应用程序的App.xaml.cs文件里有四个很关键的事件Application_Launching(应用程序启动),Application_Activated(复活),Application_Deactivated(停用),Application_Closing(应用程序关闭)

对于需要时刻保持信息更新的应用,比如即时通讯,天气,微软给出了推送通知的API,允许第三方应用调用该接口。

墓碑数据的保存和恢复
系统为我们提供了数据字典来保存数据。页面数据可以保存在Page.State,同时当程序进入墓碑状态离开页面时会触发OnNavigatedFrom方法,我们可以在这里保存页面数据。当程序复活进入页面时会触发OnNavigatedTo方法,我们在这里重新获取数据。

当我们从休眠状态复活时,程序不需要进行数据恢复,WP7.1中提供了一个属性来进行判断。

休眠状态
一般在应用程序中,用户点击Win健切出去后,应用程序即进入休眠状态。跟墓碑状态相比,此时应用程序虽然所有功能都停止运行,但是依然停留在内存中,因此当用户重新进入应用时,应用能够很快速的切换回来运行。休眠状态是WP7.1才引入的。
当一个程序从休眠状态返回时,我们不需要做任何数据恢复操作,因为程序本身就在内存中,并没有重新初始化。
当程序从墓碑状态恢复时,会触发Activated事件,在此方法中可以恢复Deactivated事件中保存的应用程序数据。

 

 

PS:这是在公司技术论坛介绍WP7开发时,收集的资料和一个提纲。 

 

 

 

posted @ 2012-02-17 17:11 Quibbler 阅读(93) 评论(0) 编辑
  2012年2月13日

public void Request(string url, string postString)
        {
            CookieContainer cookieContainer = new CookieContainer();
            HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url);//创建req
            req.Accept = "*/*";//接受任意文件
            req.UserAgent = " Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; EmbeddedWB 14.52 from: http://www.bsalsa.com/ EmbeddedWB 14.52; .NET CLR 2.0.50727)"; // 模拟使用IE在浏览
            req.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.16) Gecko/20080702 Firefox/2.0.0.16";
            req.CookieContainer = cookieContainer;
            req.Method = "POST";
            req.ContentType = "application/x-www-form-urlencoded";
            if ((postString != null & postString.Length > 0) || url.Contains("?"))
            {
                byte[] postdata = Encoding.UTF8.GetBytes(postString);
                req.BeginGetRequestStream(async1 =>
                {
                    using (Stream stream = req.EndGetRequestStream(async1))
                        stream.Write(postdata, 0, postdata.Length);
                    req.BeginGetResponse(async2 =>
                    {
                        WebResponse rep = req.EndGetResponse(async2);
                        using (Stream stream = rep.GetResponseStream())
                        using (StreamReader sr = new StreamReader(stream))
                        {
                            string content = sr.ReadToEnd();
                        }
                    }, null);
                }, null);
            }
        }

 

经验证,该方法能够成功使用。

posted @ 2012-02-13 20:26 Quibbler 阅读(266) 评论(5) 编辑
  2012年1月17日

挺喜欢知乎这个网站的,闲暇之余便做了个知乎精选,技术上没什么难度,仅练练手而已。

感兴趣的朋友可以到这里下载 http://115.com/file/be8ujjiq

posted @ 2012-01-17 22:17 Quibbler 阅读(36) 评论(0) 编辑
  2011年11月19日

今天下午的时候,部门经理告诉我,在后面的2-3个月我将去辅助别的部门进行开发工作。主要是因为那个部门的人一直做Delphi的开发,现在需要接触.net和Silverlight,需要一个比较熟悉的人去“指导”一下。

虽然部门经理说是这样说,但我感觉自己还没有足够的信心和能力去指导他们。毕竟我可能面对的是一些老程序员,在他们面前我可能会放不开。同时自己资质尚浅,虽然一直搞.net,但是对于一些较深入的东西,理解的依然不够透彻。我需要通过这2-3个月,来锻炼自己的“领导能力”,同时也更清晰的提高自己的技术水平,在让他们明白和理解的同时,我应该更明白,更理解。

 

我想成为架构师,但不是每一名程序员都能成为架构师。这是我梦开始的地方!

posted @ 2011-11-19 01:12 Quibbler 阅读(86) 评论(0) 编辑
  2011年10月30日

     因为在自己最近半年来一直在做Silverlight相关的项目,同时感觉移动领域的开发是很有前途的,对于微软Windows Phone的前景,个人是比较看好的。于是决定尝试WP7的开发。在仔细考虑之后,选择了数独作为自己的第一个WP7项目。

     关于WP7的初学文章,如果有一定的Silverlight(WPF)基础,那么我推荐张崟翻译的WP7开发31日谈http://blog.csdn.net/porscheyin/article/details/5997208

如果是没有做过Silverlight开发的朋友,再看该文章之前,最好先阅读一点Silverlight的相关资料。

     现在我们进入正题,关于数独游戏呢,相关的资料请参考http://zh.wikipedia.org/wiki/%E6%95%B0%E7%8B%AC 关于数独的算法,网上也有很多,这不是本文讨论的重点。

Main首先是程序的主页面,进行游戏难度的选择。该页面名称为GameLevel.xaml,页面主要的xaml代码如下:

   <!--ContentPanel - place additional content here-->
        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
            <StackPanel  VerticalAlignment="Top">
                <TextBlock Text="请选择一个等级开始游戏:" />
                <Button Content="Simple" Margin="0,10,0,10" Click="OnChooseLevel" />
                <Button Content="Normal" Margin="0,10,0,10" Click="OnChooseLevel"/>
                <Button Content="Hard" Margin="0,10,0,10" Click="OnChooseLevel"/>
                <Button Content="God" Margin="0,10,0,10" Click="OnChooseLevel" />        
            </StackPanel>     
        </Grid>

在进行UI设计的时候最好参考《UI_Design_and_Interaction_Guide_for_Windows_Phone_7_v2.0》

GameLevel.cs代码如下:

private void OnChooseLevel(object sender, RoutedEventArgs e)
  {
      string level = string.Empty;
      switch (((Button)sender).Content.ToString())
      {
          case "Simple":
              GameInfo.CurLevel = GameLevels.Simple;
              break;
          case "Normal":
              GameInfo.CurLevel = GameLevels.Normal;
              break;
          case "Hard":
              GameInfo.CurLevel = GameLevels.Hard;
              break;
          case "God":
              GameInfo.CurLevel = GameLevels.God;
              break;
          default:
              break;
      }
      NavigationService.Navigate(new Uri("/MainPage.xaml", UriKind.Relative));
  }

在需要进行跨页面传值的时候,我直接将需要传到下一个页面的Level参数存入了GameInfo这个静态类中。

 

选择难度后,则是进行游戏的主画面:

Game2345

从左至右分别是Simple,Normal,Hard,God难度模式下的画面。

游戏页面的主要XAML代码MainPage.xaml

<!--LayoutRoot is the root grid where all page content is placed-->
  <Grid x:Name="LayoutRoot" Background="Transparent">
      <Grid.RowDefinitions>
          <RowDefinition Height="Auto"/>
          <RowDefinition Height="*"/>
      </Grid.RowDefinitions>

      <!--TitlePanel contains the name of the application and page title-->
      <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
          <TextBlock x:Name="ApplicationTitle" Text="SudokuSeven" Style="{StaticResource PhoneTextNormalStyle}"/>
          <TextBlock x:Name="PageTitle" Text="TIME:0S" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
      </StackPanel>

      <!--ContentPanel - place additional content here-->
      <Grid x:Name="ContentPanel" Grid.Row="1" Margin="5,0,5,0">
          <Grid.RowDefinitions>
              <RowDefinition Height="491"/>
              <RowDefinition Height="116"/>
          </Grid.RowDefinitions>
          <Border Grid.Row="0" BorderBrush="Blue" BorderThickness="1" Margin="3">
              <Grid Name="grid" Grid.Row="0" ShowGridLines="True">
                  <Grid.RowDefinitions>
                      <RowDefinition Height="0.1*"/>
                      <RowDefinition Height="0.1*"/>
                      <RowDefinition Height="0.1*"/>
                      <RowDefinition Height="0.1*"/>
                      <RowDefinition Height="0.1*"/>
                      <RowDefinition Height="0.1*"/>
                      <RowDefinition Height="0.1*"/>
                      <RowDefinition Height="0.1*"/>
                      <RowDefinition Height="0.1*"/>
                  </Grid.RowDefinitions>
                  <Grid.ColumnDefinitions>
                      <ColumnDefinition Width="0.1*"/>
                      <ColumnDefinition Width="0.1*"/>
                      <ColumnDefinition Width="0.1*"/>
                      <ColumnDefinition Width="0.1*"/>
                      <ColumnDefinition Width="0.1*"/>
                      <ColumnDefinition Width="0.1*"/>
                      <ColumnDefinition Width="0.1*"/>
                      <ColumnDefinition Width="0.1*"/>
                      <ColumnDefinition Width="0.1*"/>
                  </Grid.ColumnDefinitions>
              </Grid>
          </Border>
          <StackPanel HorizontalAlignment="Center" Grid.Row="1" Orientation="Horizontal" Height="44" VerticalAlignment="Top">
              <TextBlock Name="Num1"  Text="1" Margin="10,0,10,0" FontSize="32" MouseLeftButtonDown="doSelectedNum" />
              <TextBlock Name="Num2" Text="2" Margin="10,0,10,0" FontSize="32" MouseLeftButtonDown="doSelectedNum" />
              <TextBlock Name="Num3" Text="3" Margin="10,0,10,0" FontSize="32" MouseLeftButtonDown="doSelectedNum" />
              <TextBlock Name="Num4" Text="4" Margin="10,0,10,0" FontSize="32" MouseLeftButtonDown="doSelectedNum" />
              <TextBlock Name="Num5" Text="5" Margin="10,0,10,0" FontSize="32" MouseLeftButtonDown="doSelectedNum" />
              <TextBlock Name="Num6" Text="6" Margin="10,0,10,0" FontSize="32" MouseLeftButtonDown="doSelectedNum" />
              <TextBlock Name="Num7" Text="7" Margin="10,0,10,0" FontSize="32" MouseLeftButtonDown="doSelectedNum" />
              <TextBlock Name="Num8" Text="8" Margin="10,0,10,0" FontSize="32" MouseLeftButtonDown="doSelectedNum" />
              <TextBlock Name="Num9" Text="9" Margin="10,0,10,0" FontSize="32" MouseLeftButtonDown="doSelectedNum" />
          </StackPanel>
      </Grid>
  </Grid>

  <!--Sample code showing usage of ApplicationBar-->
  <phone:PhoneApplicationPage.ApplicationBar>
      <shell:ApplicationBar IsVisible="True" IsMenuEnabled="True">
          <shell:ApplicationBarIconButton IconUri="/icons/appbar.check.rest.png" Text="Valid" Click="OnValidate"/>
          <shell:ApplicationBarIconButton IconUri="/icons/appbar.refresh.rest.png" Text="Restart" Click="OnRestart"/>
      </shell:ApplicationBar>
  </phone:PhoneApplicationPage.ApplicationBar>

在生成游戏的时候,本人采用的方法是将正确的数独结果,隐藏掉部分数字的方式。MainPage.cs中的主要代码如下:

初始化游戏的方法

private void InitGame()
{
     this.grid.Children.Clear();
     grids = new List<TextBlock>();
     SudokuMath sm = new SudokuMath();
     sm.Intial();
     int[,] map = sm.Creat();//得到一个包含正确结果的二维数组
     for (int i = 1; i <= 9; i++)
     {
         for (int j = 1; j <= 9; j++)
         {
             GridInfo gridinfo = new GridInfo() { Number = map[i, j], IsSelected = false, X = j - 1, Y = i - 1, IsHidden = false };
             TextBlock numberGrid = new TextBlock() { Tag = gridinfo, FontSize = 30, TextAlignment = TextAlignment.Center, Text = map[i, j].ToString() };
             numberGrid.MouseLeftButtonDown += new MouseButtonEventHandler(nubmberGrid_MouseLeftButtonDown);
             numberGrid.SetValue(Grid.RowProperty, i - 1);
             numberGrid.SetValue(Grid.ColumnProperty, j - 1);
             this.grid.Children.Add(numberGrid);
             grids.Add(numberGrid);
         }
     }

     SetGameLevel();
     seconds = 0;
     timer.Interval = new TimeSpan(TimeSpan.TicksPerSecond);
     timer.Start();
}

 

隐藏特定位置数字的方法

private void HideNumber(int x, int y)
{
          TextBlock grid = FindNumberGrid(x, y);
          grid.Text = unknow;
          ((GridInfo)grid.Tag).IsHidden = true;
          grid.Foreground = grid.Foreground = new SolidColorBrush(Colors.Red);
}

private TextBlock FindNumberGrid(int x, int y)
  {
          foreach (TextBlock grid in grids)
          {
              GridInfo gridinfo = grid.Tag as GridInfo;
              if (gridinfo.X == x && gridinfo.Y == y)
              {
                  return grid;
              }
          }
          return new TextBlock();
  }

 

GridInfo.cs类

public class GridInfo
{
     public int Number { get; set; }
     public bool IsSelected { get; set; }
     public int X { get; set; }
     public int Y { get; set; }
     public bool IsHidden { get; set; }
}


 

至此一个简单的WP7应用就完成了。

posted @ 2011-10-30 20:48 Quibbler 阅读(463) 评论(2) 编辑
  2011年10月16日
摘要: 现在才慢慢的发现,自出除了代码好像什么都没有。很少主动去联系朋友,自己沉醉在自己的世界里,深深的不能自拔; 以前总认为代码是自己的所有,幸福的事莫过于能写出让人赞扬的代码,做出很屌的应用;自负的认为通过我的双手,我能写出我想要的一切;现在才发现自己也会觉得疲惫,这不是厌恶,只是会想自己除了写代码还能做什么;貌似除了能凑合着写写代码,其他事我一件都做不好。 生活中的不快我总会代入工作中,我觉得这是自己不成熟的表现;生活是生活,工作是工作,我应该要明确的分开,不能让他们互相影响,否则受伤的只会是自己。 毕业半年,经历得也比较多了;譬如自己完全主动的去追一个女孩,虽然最后的结局并不...阅读全文
posted @ 2011-10-16 10:04 Quibbler 阅读(16) 评论(0) 编辑
  2010年6月27日
摘要: Vs 2003用多了,装了VS 2005就有点用不习惯了,以前在2003里面不会因为在线程里面对其它线程中的控件进行操作而报错,到了2005这个就变成一个异常了,不过这也是为了线程之间的安全性,所以只能找新的方法来实现原来的跨线程操作了。 在讲解如何进行跨线程操作前,我抄一段摘自网上关于VS2005进行这一改动的好处的说法: 由于Windows窗体控件本质上不是线程安全的。因此如果有两个或多个线程...阅读全文
posted @ 2010-06-27 21:00 Quibbler 阅读(72) 评论(0) 编辑
  2010年6月24日
摘要: 一个String对象的长度是固定的,不能改变它的内容,或者是附加新的字符至String对象中。您也许会使用+来串联字符串以达到附加新字符或字符串的目的,但+会产生一个新的String实例。如果程序对这种附加字符串的需求很频繁,并不建议使用+来进行字符串的串联。在面向对象程序设计中,最好是能重复运用已生成的对象,对象的生成需要内存空间与时间,不断地产生String实例是一个没有效率的行为。strin...阅读全文
posted @ 2010-06-24 21:10 Quibbler 阅读(21) 评论(0) 编辑
  2010年3月21日
摘要: 接了朋友的一个Web项目来做,虽然自己以前一直更喜欢做Winform,不过我带是很乐意尝试做做Web,也算是对自己的一种锻炼吧。 为了这个项目联系了MSTC里的3名成员一起做,这是我第一次感觉到技术可以换来money吧,离我是如此的近。阅读全文
posted @ 2010-03-21 00:41 Quibbler 阅读(32) 评论(0) 编辑
  2010年2月16日
摘要: 亲戚走了,家里也安静了许多。阅读全文
posted @ 2010-02-16 17:59 Quibbler 阅读(22) 评论(0) 编辑
仅列出标题  下一页