构建RE3过程中的收获

Author Avatar
huuhghhgyg 8月 09, 2017
  • 在其它设备中阅读本文章

构建RE3过程中的收获与笔记

从网络获取图片并用Grid显示

有时候,用Image控件并不是那么方便,这个方法就起到作用了。
用法:直接给出URLGrid的名称。URL必须指向网络上的某个图片文件

void GetPictureFromURL(string URL, Grid grid)
{
    var request = WebRequest.Create(URL);

    using (var response = request.GetResponse())
    using (var stream = response.GetResponseStream())
    {
        var imgBrush = new ImageBrush();
        
        var bitmap = new BitmapImage();
        bitmap.BeginInit();//开始设置属性
        bitmap.StreamSource = stream;
        bitmap.EndInit();//终止设置属性
        
        imgBrush.ImageSource = bitmap;
        grid.Background = imgBrush;
    }
}

获取网页文件完整内容

有时候,需要获取网页文件的内容来获取部分信息,帮助程序运行。
用法:直接给出URL。URL必须指向网络上的某个文件

static string GetRequest(string URL)//用于获取网页文件内容
{
    var request = (HttpWebRequest)WebRequest.Create(URL);
    var response = (HttpWebResponse)request.GetResponse();
    var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
    return responseString.ToString();
}

更换Grid的背景为图片

这个方法好像网络上没什么人说啊…我这里公布一下…
用法:给出图片文件的路径,建议用·OpenFileDialog·进行操作。

void ChangeBackground(string Path)//更改主页背景
{
    var imgBrush = new ImageBrush();

    imgBrush.ImageSource = new BitmapImage(new Uri(@Path, UriKind.Relative));
    ExampleGrid.Background = imgBrush;
}

OpenFileDialog针对上文的操作:

OpenFileDialog dialog = new OpenFileDialog();//打开选择文件对话框
dialog.Filter = "PNG图片|**.png|JPG图片|**.jpg";//可选择png或者jpg文件

动态添加控件

这里的动态添加控件针对的是Panel类的控件
WarpPanel,StackPanel,DockPanel等…(以后要是知道了会继续补充2333)
步骤:

  • 创建一UserControl (UserControl的第一次竟然是被我这么用法2333)
  • InitializeComponent();的方法块上,将无参(数)改为有参(数)。
    这里参数你爱写啥就写啥。实在没有也可以不写。
  • 这时你应该搞定了UserControl,你可以去调用这个UserControl了。
  • 贡献一段我的代码:ThemeList.Children.Add(new Theme.ThemeItem(ThemeIcon, ThemeName, ThemeDir));
    ThemeList是我的一个Panel
    Theme.ThemeItem指的是Theme文件夹下的ThemeListThemeList是一个UserControl
    – 至于ThemeIcon,ThemeNameThemeDir,都是参数。我依靠这些参数让ThemeList自动处理这些数据。在我的应用程序里是将它们显示出来。

这里的核心代码:ThemeList.Children.Add(new Theme.ThemeItem(ThemeIcon, ThemeName, ThemeDir));
这段代码你应该会用了吧2333

读取XML文件

这个我也很头疼,下面的方案是半残的2333…

public void check(string url)
{
    XmlDocument doc = new XmlDocument();
    doc.Load(url);
    XmlNode config = doc.SelectSingleNode("Config");
    // 得到根节点Config
    XmlNodeList configList = config.ChildNodes;
    New = configList.Item(0).InnerText;
    ProgramURL = configList.Item(1).InnerText;
    ConfigURL = configList.Item(2).InnerText;
    RecoveryURL = configList.Item(3).InnerText;
}

在这里,是按123顺序读取了XML文件。这就是半残的原因。
网络上的XML文档是这样的:

<?xml version="1.0" encoding="utf-8"?>
<Config source="Launcher">
    <Version>1</Version>
    <ProgramURL>https://xxxxxxx</ProgramURL>
    <ConfigURL>https://xxxxxxx/ConfigURL>
    <Recovery>https://xxxxxxx</Recovery>
</Config>

注明:这里的代码都是被修改过的,但也能够懂了吧…

切换Grid视图

WPF的话存在一个问题:你不能总是依靠类似TabControl的这些控件来换页。
这里先提供步骤:

  • 创建一个Page文件,你的命名我不知道,我简称为GRID1
  • 创建完成后将xaml文件开头的<Page改为<Grid (应该找得到吧2333)
  • 转到文件的代码,将代码的继承:Page改为:Grid,并将这个Grid的名称改掉。你改成什么名称我不知道我先简称GRID
  • 完成!

下面是代码部分:

Grid grid;
grid = new GRID1();
GRID.Children.Clear();
GRID.Children.Add(grid);

执行完以后就将显示的页面从GRID切换到了GRID1

[思路]你如何替用户更新你的程序? RecoveryMode。

这里提供一种思路,启发于安卓的Recovery更新机制。(熟悉刷机的同学可以跳过)
简单地说:当旧的安卓系统通过系统更新程序下载好了新的安卓系统的安装包时,旧的安卓系统会命令设备进入预先设置好的Recovery模式。Recovery事实上也是一套系统,但是它在运行的时候安卓系统已经关机,安卓系统的文件不会被占用。所以这个时候Recovery可以通过安装包对旧的安卓系统进行更新。

那么,这种机制/模式能不能运用到我们的软件更新中呢?
我已经做出了基于这种机制/模式的更新,而且使用效果非常不错。
在recovery的第一行代码中,我就输入了这样的代码:
Thread.Sleep(1000);//等待1秒
这行代码的目的是等待主程序的退出,结束主程序对本身文件(.exe)的占用,使得Recovery程序可以对主程序进行升级。
在这里不对赘述了。有兴趣的同学可以对此项目进行研究 跳转到Recovery项目
最后,感谢Android的开源和诞生。感谢它给我的思路和启发。

That’s all,thanku :)

更新(2017/8/29)

已将代码同步至GitHub。
将N早之前的委托代码写上来,免得去GitHub翻了:

Dispatcher.Invoke(new Action(delegate
{
    
}));
link
本文链接:
发文时间
8月 09, 2017
请遵循协议