当前位置:  编程技术>.net/c#/asp.net
本页文章导读:
    ▪Windows 8 文件关联和程序合约          在windows系统中,我们经常会遇到这样的情况,比如想打开一个图片文件,我们点击鼠标右键,在右键选项中,我们一般会选择打开方式,然后选择能打开图片的应用程序。今天将介.........
    ▪Windows 8 Metro中文件的操作及访问(读写删除复制)       1.首先创建一个文件夹,在文件夹里创建文件   private async void CreateButton_Click(object sender, RoutedEventArgs e)        {    string name=FileName.Text;  //创建文件的名.........
    ▪C#多线程处理webbrowser及InvokeMember("click")无响应的问题      文章重点:多线程处理webbrowser的相关问题,并解决触发click事件,js无响应问题最近刚好碰上一个需求:循环遍历网页元素,找到innerText为指定的内容时,就模拟人工点击解决办法:使用WebBrow.........

[1]Windows 8 文件关联和程序合约
    来源:    发布时间: 2013-10-28

    在windows系统中,我们经常会遇到这样的情况,比如想打开一个图片文件,我们点击鼠标右键,在右键选项中,我们一般会选择打开方式,然后选择能打开图片的应用程序。今天将介绍如何将我们的应用程序注册为这样的一个程序,当我想打开图片,然后再打开方式中选择我们自己的应用程序,来打开图片。如下图:

1.文件关联

  1).  注册打开确定的文件类型

   当程序打开的文件类型适合于我们的程序时,要想在上面的列表中看到我们的程序,操作起来很简单,只需要修改一下项目中package.appxmanifest文件即可。打开Package.appxmanifest文件,选择"声明"选项卡。在“可用声明”选择列表中,选择“文件类型关联”,然后点击添加。这时,你会看到右边一个新的表单显示在屏幕上,这个表单是与文件关联相关的。默认情况下,这里会有几个红色的X,需要你来填写相关内容。如下图:

  在支持的文件类型选项中,我们可以设置成我们自己的文件类型,比如(.win)。 微标是当一个程序是某个文件类型的默认打开程序时,我想要显示自己的logo 或者icon,就像Excel有一个Excel图标,为了达到这个效果,打开package.appxmanifest文件,在指定name的地方,指定一个logo,即可。

  当你做完了上面的步骤,那么基本的工作就完成了。现在运行一次程序,将其安装到你的系统中,然后尝试使用“打开方式”打开一个指定的类型。选择一个图片,然后再打开方式中就可以看到我们的应用程序了。

  2).  处理打开的文件。

  当我们通过选择打开方式,打开一个图片后,怎样在我们的应用程序中显示出来呢?此时,我们应该做如下工作:

     在程序的App.xaml.cs文件中,可以通过重写Application中的OnFileActivated方法,来捕获打开文件的事件,并做相应的处理,如下代码:

     protected override void OnFileActivated(FileActivatedEventArgs args)

     {

          Frame frame = Window.Current.Content as Frame;

              if (frame == null)

             {

                   frame =new Frame();             

              Window.Current.Content = frame;

            }

         if (!frame.Navigate(typeof(MainPage), args))

            {

                   throw new Exception("Failed to create initial page");

            }

           

    
[2]Windows 8 Metro中文件的操作及访问(读写删除复制)
    来源:    发布时间: 2013-10-28

 1.首先创建一个文件夹,在文件夹里创建文件

   private async void CreateButton_Click(object sender, RoutedEventArgs e)

        {

    string name=FileName.Text;  //创建文件的名称

    folder =ApplicationData.Current.LocalFolder;

    StorageFolder tempFolder = await folder.CreateFolderAsync("Config",CreationCollisionOption.OpenIfExists);

            file =await tempFolder.CreateFileAsync(name,CreationCollisionOption.OpenIfExists);

        }

    2.在创建好的文件里,写入我们的数据,这里介绍三种写入文件的方式

  private async void WriteButton_Click(object sender, RoutedEventArgs e)

        {        

     string content = InputTextBox.Text.Trim();        

     ComboBoxItem item = WriteType.SelectedItem asComboBoxItem;  //选择写入的方式

     string type = item.Tag.ToString();

           switch (type)

            {           

      case"1"

    
[3]C#多线程处理webbrowser及InvokeMember("click")无响应的问题
    来源:    发布时间: 2013-10-28

文章重点:多线程处理webbrowser的相关问题,并解决触发click事件,js无响应问题

最近刚好碰上一个需求:循环遍历网页元素,找到innerText为指定的内容时,就模拟人工点击

解决办法:使用WebBrowser将指定位置的文档加载到 WebBrowser 控件中(注:这里的webbrowser是在拉控件的方式,而不是直接在代码中new)

源码如下:

private void loadPage(object URL)
{
try
{
string url = (string)URL;
browser.Navigate(url);
while (true)
{
Application.DoEvents();
if(browser.ReadyState != WebBrowserReadyState.Complete)
{
break;
}
}
HtmlDocument document = browser.Document;
HtmlElementCollection elems = browser.Document.GetElementsByTagName("a");
foreach (HtmlElement em in elems)
{
if (em.InnerText == "测试")
{
em.InvokeMember("click");//"触发点击事件"
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

有一点没说到,上面的只适合单线程的,如果执行以上代码的是在新开辟的一个线程中的话,会碰到一系列的问题......(很遗憾,我没有将那些问题记录下来,但相信如果你跟我有着同样的需求的话,即采用多线程的方式处理webbrowser加载的网页内容的话,可以继续看下去,也许对你有所帮助)

网上一搜,关于webbrowser在多线程中的使用着实会碰到很多问题……后来,经过自己不断的Google(在这过程中你能体会到百度离Google还有多远),有找到了几篇对我有所帮助的文章:

关于线程的知识:http://www.cnblogs.com/JimmyZheng/archive/2012/06/10/2543143.html

WebBrowser多线程带来的麻烦:http://www.cnblogs.com/xjfhnsd/archive/2010/03/14/1685441.html

WebBrowser 显示Html内容3点细节技巧: http://www.cnblogs.com/cyq1162/archive/2012/03/27/2419655.html

 

接着,我就使用webclient配合webbrowser从而顺利的解决了问题。

WebClient:下载指定网址的源码

WebBrowser:navigate一个空白页(具体参考:)

注:这里的WebBrowser要从代码中new,如果是拉控件的方式创建的,将会报错:"指定的转换无效"

这里我就写一个以上列出的文章所没有提到的。

比如,我们要click的网页元素是通过js来触发的,而使用webclient只能下载指定的url的网页源码,无法自动加载相关的js,因此导致在使用invokeMember("click")的时候,没能见到预期效果。

解决办法:将指定的js文件也下载下来(或者将需要用到的js方法放到本地,使用webclient  载入进来也行)

我这里说的只是一个大题的思路和解决途径

最后,贴上一段测试代码:

C#源码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
using System.Net;
namespace webbrowser控件
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Control.CheckForIllegalCrossThreadCalls = false;
ParameterizedThreadStart pt;
pt = new ParameterizedThreadStart(loadPage);
Thread td = new Thread(pt);
td.Name = "主线程";
td.SetApartmentState(ApartmentState.STA);//在线程启动前设置其单元状态
td.Start("http://127.0.0.1/test.html");
}
private void loadPage(object URL)
{
try
{
string url = (string)URL;
WebBrowser browser = new WebBrowser();//当前线程不在单线程单元中,因此无法实例化 ActiveX 控件
browser.ScriptErrorsSuppressed = true;
//browser.Navigate(url);
//browser.DocumentCompleted += browser_DocumentCompleted;
browser.Navigate("about:blank");
string htmlcode = GetHtmlSource(url);
string js = GetHtmlSource("http://127.0.0.1/MY/test/js.html");//载
    
最新技术文章:
▪C#通过IComparable实现ListT.sort()排序
▪C#实现对Json字符串处理实例
▪Winform实现抓取web页面内容的方法
▪Winform实现将网页生成图片的方法
▪C#控制台程序中处理2个关闭事件的代码实例
▪WinForm实现同时让两个窗体有激活效果的特效...
▪WinForm实现拦截窗体上各个部位的点击特效实...
▪用C#的params关键字实现方法形参个数可变示例
▪C#判断某程序是否运行的方法
▪C#验证码识别基础方法实例分析
▪C#通过WIN32 API实现嵌入程序窗体
▪C#实现获取鼠标句柄的方法
▪C#事件处理和委托event delegate实例简述
▪C#获取程序文件相关信息的方法
▪C#中的除法运算符与VB.NET中的除法运算符
▪ASP.NET MVC 5使用X.PagedList.Mvc进行分页教程(PagedLi...
▪Base64编码解码原理及C#编程实例
▪C#实现的优酷真实视频地址解析功能(2014新算...
▪C#和SQL实现的字符串相似度计算代码分享
▪C#使用Word中的内置对话框实例
▪C#反射之基础应用实例总结
▪C#生成单页静态页简单实例
▪C#实现SMTP邮件发送程序实例
▪C#实现随鼠标移动窗体实例
▪C#使用GDI+创建缩略图实例
▪C#实现通过模板自动创建Word文档的方法
▪C#中Response.Write常见问题汇总
▪C#中多态、重载、重写区别分析
▪WinFrom中label背景透明的实现方法
▪C#中out保留字用法实例分析
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3