WP7:一键重启

关于在WP7上使用 ‘native code’ ,相信都有所了解或者有所听说了,也就是 使用C++ DLL,关于有关资料,可以去http://blog.walshie.me/2010/11/12/windows-phone-7-native-apps-the-missing-link/ 这里看一下。

进入正题。

写一个一键重启的小程序,小试一下。

新建一个工程。然后添加两个必备的东西。

呵呵,不用说肯定是要引用的DLL。

就是这个,一个别人写好的DLL,拿来引用下。

还有一个是封装好的库,C#写的,方便调用方法。

然后呢,就开始动工了。

前台代码:

1 <!--ContentPanel - place additional content here-->
2 <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
3 <ToggleButton Height="202" HorizontalAlignment="Center" Margin="0,189,0,0" Content="{Binding IsChecked,ElementName=toggleButton}" IsChecked="False" Name="toggleButton" VerticalAlignment="Top" Width="202" Click="toggleButton_Click" />
4 </Grid>

呵呵,非常简单,一个ToggleButton,用来显示状态。

一键重启,就是把程序 pin 到桌面,点击生成的 Tile 就直接重启。不用在进入程序了。

为了达到更好的效果呢,我们把闪屏 delete 掉。

下面来写方法。

 1 void CreateTile()
2 {
3 ShellTile tile = ShellTile.ActiveTiles.FirstOrDefault(x => x.NavigationUri.ToString().Contains("Reboot"));
4 if (tile == null)
5 {
6 StandardTileData data = new StandardTileData
7 {
8 BackgroundImage = new Uri("/Images/reboot.png", UriKind.Relative),
9 Title = ""
10 };
11 ShellTile.Create(new Uri("/MainPage.xaml?Reboot=true", UriKind.Relative), data);
12 }
13 }

这个是用来生成桌面Tile的方法。很简单,要注意的是 create 的 Tile 的 Uri 后面要加个参数。

因为要想实现点击桌面Tile,直接进行重启,而不是进入程序,需要有一个判断。所以这里是关键。

下面是删除 Tile 方法:

1 void DeleteTile()
2 {
3 ShellTile TileToFind = ShellTile.ActiveTiles.FirstOrDefault(x => x.NavigationUri.ToString().Contains("Reboot=true"));
4
5 if (TileToFind != null)
6 {
7 TileToFind.Delete();
8 }
9 }

这个也是根据后面的参数删除相应的桌面 Tile 。而不是删掉长按程序而产生的 Tile。

在toggleButton的Click事件里调用这两个方法。

 1 private void toggleButton_Click(object sender, RoutedEventArgs e)
2 {
3 if (toggleButton.IsChecked == true)
4 {
5 CreateTile();
6 }
7 else
8 {
9 DeleteTile();
10 }
11 }

前面说到,实现的效果是点击桌面 Tile 就直接进行重启,而不是进入程序,所以就要根据参数来判断了,实现这个过程是在 程序 一进入的时候。

也就是 OnNavigatedTo。因为 OnNavigatedTo 比 Loaded 事件 要先发生。

 1 protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
2 {
3 base.OnNavigatedTo(e);
4 string str;
5
6 if (NavigationContext.QueryString.TryGetValue("Reboot", out str))
7 {
8 Shell.Reboot();
9 }
10
11 toggleButton.IsChecked = IsPin();
12 }

用到 QueryString.TryGetValue 判断 这个KEY 是不是有值。

如果有值,则进行重启。

那 Shell.Reboot() 这个方法呢,就是要调用的重启方法。

需要应用上面说的那个C#封装好的DLL。

using NativeAccess.Shell;

这个DLL 里还有很多的方法。就不一一叙述了,可以自己下载后面的 DEMO 去了解。

上面代码最下面还有一个 IsPin() 方法,一个布尔类型的。

它是用来 更新 toggleButton 的 选择状态的。

1 bool IsPin()
2 {
3 ShellTile TileToFind = ShellTile.ActiveTiles.FirstOrDefault(x => x.NavigationUri.ToString().Contains("Reboot=true"));
4 if (TileToFind == null)
5 return false;
6 return true;
7 }

好了,写完了,有兴趣的可以试一下。补充一点,此程序只能在真机上运行才能到达效果。

 Reboot.zip









 世界不会在意你的自尊,人们看的只是你的成就。在你没有成就以前,切勿过分强调自尊。——比尔·盖茨
原文地址:https://www.cnblogs.com/Walsh/p/2289420.html