WPFipad如何卸载软件U盘

protected&override&void&WndProc(ref&Message&m)
方法,根据得到的系统消息来处理,但是如果要实时更新的话,最好加上定时查询U口设备,将查询结果更新,时间的间隔可以自己定义,根据项目情况吧。
下面是完整的代码,如果大家有什么好的建议,欢迎大家一起交流。
using&System.Collections.G
using&System.ComponentM
using&System.D
using&System.D
using&System.T
using&System.IO;
using&System.Windows.F
using&System.T
namespace&WindowsApp
&&&&public&partial&class&ComboBoxForm2&:&Form
&&&&&&&&private&IList&string&&diskList&=&new&List&string&();
&&&&&&&&delegate&void&SetTextCallback(string&s);
&&&&&&&&delegate&void&ClearListBoxItem();
&&&&&&&&private&Thread&thread&=&null;
&&&&&&&&private&BackgroundWorker&
&&&&&&&&public&ComboBoxForm2()
&&&&&&&&&&&&InitializeComponent();
&&&&&&&&protected&override&void&WndProc(ref&Message&m)
&&&&&&&&&&&&object&ojb&=&new&object();
&&&&&&&&&&&&try
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&//WM_DEVICECHANGE,系统硬件改变发出的系统消息
&&&&&&&&&&&&&&&&if&(m.Msg&==&WndProMsgConst.WM_DEVICECHANGE)
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&switch&(m.WParam.ToInt32())
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&case&WndProMsgConst.WM_DEVICECHANGE:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&break;
&&&&&&&&&&&&&&&&&&&&&&&&//DBT_DEVICEARRIVAL,设备检测结束,并且可以使用
&&&&&&&&&&&&&&&&&&&&&&&&case&WndProMsgConst.DBT_DEVICEARRIVAL:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&scanUDisk();
&&&&&&&&&&&&&&&&&&&&&&&&&&&&listBox1.Items.Clear();
&&&&&&&&&&&&&&&&&&&&&&&&&&&foreach&(string&s&in&diskList)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&listBox1.Items.Add(s);
&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&break;
&&&&&&&&&&&&&&&&&&&&&&&&//DBT_DEVICEREMOVECOMPLETE,设备卸载或者拔出
&&&&&&&&&&&&&&&&&&&&&&&&case&WndProMsgConst.DBT_DEVICEREMOVECOMPLETE:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&scanUDisk();
&&&&&&&&&&&&&&&&&&&&&&&&&&&&listBox1.Items.Clear();
&&&&&&&&&&&&&&&&&&&&&&&&&&&&foreach&(string&s&in&diskList)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&listBox1.Items.Add(s);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&break;
&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&}
&&&&&&&&&&&&catch&(Exception&ex)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&MessageBox.Show("当前盘不能正确识别,请重新尝试!",&"提示",&MessageBoxButtons.OK,&MessageBoxIcon.Information);
&&&&&&&&&&&&}
&&&&&&&&&&&&base.WndProc(ref&m);
&&&&&&&&private&void&button1_Click(object&sender,&EventArgs&e)
&&&&&&&&&&&&IList&string&&diskList&=&new&List&string&();
&&&&&&&&&&&&diskList.Add("k001");
&&&&&&&&&&&&diskList.Add("k002");
&&&&&&&&&&&&diskList.Add("k003");
&&&&&&&&&&&&diskList.Add("k004");
&&&&&&&&&&&&comboBox1.DataSource&=&diskL
&&&&&&&&///&&summary&
&&&&&&&&///&扫描U口设备
&&&&&&&&///&&/summary&
&&&&&&&&///&&param&name="obj"&&/param&
&&&&&&&&private&void&scanUDisk()
&&&&&&&&&&&&diskList.Clear();
&&&&&&&&&&&&DriveInfo[]&drives&=&DriveInfo.GetDrives();
&&&&&&&&&&&&foreach&(DriveInfo&drive&in&drives)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&if&((drive.DriveType&==&DriveType.Removable)&&&&!drive.Name.Substring(0,&1).Equals("A"))
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&try
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&diskList.Add(drive.Name);
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&catch
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&MessageBox.Show("当前盘不能正确识别,请重新尝试!",&"提示",&MessageBoxButtons.OK,&MessageBoxIcon.Information);
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&}
&&&&&&&&private&void&ComboBoxForm2_Load(object&sender,&EventArgs&e)
&&&&&&&&&&&&System.Timers.Timer&timer&=&new&System.Timers.Timer(1000);
&&&&&&&&&&&&timer.Enabled&=&true;
&&&&&&&&&&&&timer.Elapsed&+=&new&System.Timers.ElapsedEventHandler(fi);
&&&&&&&&&&&&timer.AutoReset&=&true;
&&&&&&&&&&&&
&&&&&&&&private&void&ThreadProcSafe()
&&&&&&&&&&&&scanUDisk();
&&&&&&&&&&&&//MessageBox.Show(diskList.Count.ToString());
&&&&&&&&&&&&foreach&(string&s&in&diskList)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&SetText(s);
&&&&&&&&&&&&}
&&&&&&&&public&void&SetText(string&text)
&&&&&&&&&&&&if&(this.listBox1.InvokeRequired)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&if&(listBox1.Items.Contains(text))
&&&&&&&&&&&&&&&&&&&&return;
&&&&&&&&&&&&&&&&SetTextCallback&d&=&new&SetTextCallback(SetText);
&&&&&&&&&&&&&&&&this.Invoke(d,&new&object[]&{&text&});
&&&&&&&&&&&&}
&&&&&&&&&&&&else
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&if&(listBox1.Items.Contains(text))
&&&&&&&&&&&&&&&&&&&&return;
&&&&&&&&&&&&&&&&this.listBox1.Items.Add(text);
&&&&&&&&&&&&}
&&&&&&&&void&fi(object&sender,&System.Timers.ElapsedEventArgs&e)
&&&&&&&&&&&&scanUDisk();
&&&&&&&&&&&&//listBox1.Items.Clear();
&&&&&&&&&&&&foreach&(string&s&in&diskList)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&SetText(s);
&&&&&&&&&&&&}
&&&&///&&summary&
&&&&///&windows消息的常量
&&&&///&&/summary&
&&&&class&WndProMsgConst
&&&&&&&&#region&WndProc常量
&&&&&&&&public&const&int&WM_DEVICECHANGE&=&0x219;
&&&&&&&&public&const&int&DBT_DEVICEARRIVAL&=&0x8000;
&&&&&&&&public&const&int&DBT_CONFIGCHANGECANCELED&=&0x0019;
&&&&&&&&public&const&int&DBT_CONFIGCHANGED&=&0x0018;
&&&&&&&&public&const&int&DBT_CUSTOMEVENT&=&0x8006;
&&&&&&&&public&const&int&DBT_DEVICEQUERYREMOVE&=&0x8001;
&&&&&&&&public&const&int&DBT_DEVICEQUERYREMOVEFAILED&=&0x8002;
&&&&&&&&public&const&int&DBT_DEVICEREMOVECOMPLETE&=&0x8004;
&&&&&&&&public&const&int&DBT_DEVICEREMOVEPENDING&=&0x8003;
&&&&&&&&public&const&int&DBT_DEVICETYPESPECIFIC&=&0x8005;
&&&&&&&&public&const&int&DBT_DEVNODES_CHANGED&=&0x0007;
&&&&&&&&public&const&int&DBT_QUERYCHANGECONFIG&=&0x0017;
&&&&&&&&public&const&int&DBT_USERDEFINED&=&0xFFFF;
&&&&&&&&#endregion
设备的实时性还是差一点,还有啊,像这样的窗体有很多,我不能每个窗体都copy一遍这些代码吧,如何封装起来呢,控件的线程安全也是问题,还需要改进啊,谁有好的意见可以提出来。
简单封装了一下,封装类如下:
using&System.Collections.G
using&System.T
using&System.Windows.F
using&System.T
using&System.IO;
namespace&WindowsApp
&&&&class&Class1
&&&&&&&&private&IList&string&&diskList&=&new&List&string&();
&&&&&&&&delegate&void&SetTextCallback(string&s);
&&&&&&&&delegate&void&ClearListBoxItem();
&&&&&&&&private&ListBox&_
&&&&&&&&private&Form&_
&&&&&&&&private&Thread&thread&=&null;
&&&&&&&&//private&BackgroundWorker&
&&&&&&&&public&Class1()
&&&&&&&&&&&&System.Timers.Timer&timer&=&new&System.Timers.Timer(1000);
&&&&&&&&&&&&timer.Enabled&=&true;
&&&&&&&&&&&&timer.Elapsed&+=&new&System.Timers.ElapsedEventHandler(fi);
&&&&&&&&&&&&timer.AutoReset&=&true;
&&&&&&&&public&void&filldata(Form&form,&Message&m,ListBox&listbox)
&&&&&&&&&&&&_listbox&=&
&&&&&&&&&&&&_form&=&
&&&&&&&&&&&&try
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&//WM_DEVICECHANGE,系统硬件改变发出的系统消息
&&&&&&&&&&&&&&&&if&(m.Msg&==&WndProMsgConst.WM_DEVICECHANGE)
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&switch&(m.WParam.ToInt32())
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&case&WndProMsgConst.WM_DEVICECHANGE:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&break;
&&&&&&&&&&&&&&&&&&&&&&&&//DBT_DEVICEARRIVAL,设备检测结束,并且可以使用
&&&&&&&&&&&&&&&&&&&&&&&&case&WndProMsgConst.DBT_DEVICEARRIVAL:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&scanUDisk();
&&&&&&&&&&&&&&&&&&&&&&&&&&&&_listbox.Items.Clear();
&&&&&&&&&&&&&&&&&&&&&&&&&&&&foreach&(string&s&in&diskList)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&_listbox.Items.Add(s);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&break;
&&&&&&&&&&&&&&&&&&&&&&&&//DBT_DEVICEREMOVECOMPLETE,设备卸载或者拔出
&&&&&&&&&&&&&&&&&&&&&&&&case&WndProMsgConst.DBT_DEVICEREMOVECOMPLETE:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&scanUDisk();
&&&&&&&&&&&&&&&&&&&&&&&&&&&&_listbox.Items.Clear();
&&&&&&&&&&&&&&&&&&&&&&&&&&&&foreach&(string&s&in&diskList)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&_listbox.Items.Add(s);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&break;
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&}
&&&&&&&&&&&&catch&(Exception&ex)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&MessageBox.Show("当前盘不能正确识别,请重新尝试!",&"提示",&MessageBoxButtons.OK,&MessageBoxIcon.Information);
&&&&&&&&&&&&}
&&&&&&&&public&void&SetText(string&text)
&&&&&&&&&&&&if&(this._listbox.InvokeRequired)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&if&(_listbox.Items.Contains(text))
&&&&&&&&&&&&&&&&&&&&return;
&&&&&&&&&&&&&&&&SetTextCallback&d&=&new&SetTextCallback(SetText);
&&&&&&&&&&&&&&&&_form.Invoke(d,&new&object[]&{&text&});
&&&&&&&&&&&&}
&&&&&&&&&&&&else
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&if&(_listbox.Items.Contains(text))
&&&&&&&&&&&&&&&&&&&&return;
&&&&&&&&&&&&&&&&this._listbox.Items.Add(text);
&&&&&&&&&&&&}
&&&&&&&&void&fi(object&sender,&System.Timers.ElapsedEventArgs&e)
&&&&&&&&&&&&scanUDisk();
&&&&&&&&&&&&//listBox1.Items.Clear();
&&&&&&&&&&&&foreach&(string&s&in&diskList)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&SetText(s);
&&&&&&&&&&&&}
&&&&&&&&}///&&summary&
&&&&&&&&///&扫描U口设备
&&&&&&&&///&&/summary&
&&&&&&&&///&&param&name="obj"&&/param&
&&&&&&&&private&void&scanUDisk()
&&&&&&&&&&&&diskList.Clear();
&&&&&&&&&&&&DriveInfo[]&drives&=&DriveInfo.GetDrives();
&&&&&&&&&&&&foreach&(DriveInfo&drive&in&drives)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&if&((drive.DriveType&==&DriveType.Removable)&&&&!drive.Name.Substring(0,&1).Equals("A"))
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&try
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&diskList.Add(drive.Name);
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&catch
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&MessageBox.Show("当前盘不能正确识别,请重新尝试!",&"提示",&MessageBoxButtons.OK,&MessageBoxIcon.Information);
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&}
&&&&}&///&&summary&
&&&&///&windows消息的常量
&&&&///&&/summary&
&&&&class&WndProMsgConst
&&&&&&&&#region&WndProc常量
&&&&&&&&public&const&int&WM_DEVICECHANGE&=&0x219;
&&&&&&&&public&const&int&DBT_DEVICEARRIVAL&=&0x8000;
&&&&&&&&public&const&int&DBT_CONFIGCHANGECANCELED&=&0x0019;
&&&&&&&&public&const&int&DBT_CONFIGCHANGED&=&0x0018;
&&&&&&&&public&const&int&DBT_CUSTOMEVENT&=&0x8006;
&&&&&&&&public&const&int&DBT_DEVICEQUERYREMOVE&=&0x8001;
&&&&&&&&public&const&int&DBT_DEVICEQUERYREMOVEFAILED&=&0x8002;
&&&&&&&&public&const&int&DBT_DEVICEREMOVECOMPLETE&=&0x8004;
&&&&&&&&public&const&int&DBT_DEVICEREMOVEPENDING&=&0x8003;
&&&&&&&&public&const&int&DBT_DEVICETYPESPECIFIC&=&0x8005;
&&&&&&&&public&const&int&DBT_DEVNODES_CHANGED&=&0x0007;
&&&&&&&&public&const&int&DBT_QUERYCHANGECONFIG&=&0x0017;
&&&&&&&&public&const&int&DBT_USERDEFINED&=&0xFFFF;
&&&&&&&&#endregion
使用方法如下:
using&System.Collections.G
using&System.ComponentM
using&System.D
using&System.D
using&System.T
using&System.IO;
using&System.Windows.F
using&System.T
namespace&WindowsApp
&&&&public&partial&class&ComboBoxForm2&:&Form
&&&&&&&&public&ComboBoxForm2()
&&&&&&&&&&&&InitializeComponent();
&&&&&&&&protected&override&void&WndProc(ref&Message&m)
&&&&&&&&&&&&Class1&c=new&Class1();
&&&&&&&&&&&&c.filldata(this,m,&listBox1);
&&&&&&&&&&&&
&&&&&&&&&&&&base.WndProc(ref&m);Linux中U盘和SD卡加载卸载命令 - DoubleLi - 博客园
U盘挂载命令U盘插入的时候会显示启动信息,启动信息中sda: sda1指U盘的设备名为sda1dev设备目录下有一个sda1设备文件,此设备文件就是我们插入的U盘,我们将这个设备文件挂载到Linux系统的/mnt/udisk1这个目录下,这样我们即可以通过访问/mnt/udisk1目录来读写U盘,挂载用mount命令[root@TX2440A /]# mount /dev/sda1 /mnt/udisk1精简写法为mntud1,功能与mount /dev/sda1 /mnt/udisk1相同[root@TX2440A /]# mntud1进入到/mnt/udisk1目录下查看U盘中的内容,如果内容与U盘中的内容相同则说明U盘挂载成功[root@TX2440A /]# ls /mnt/udisk1
取消U盘挂载命令取消挂载用umount命令,加上要取消挂载的目录/mnt/udisk1[root@TX2440A /]# umount /mnt/udisk1再查看/mnt/udisk1目录下发现已经没有内容了则说明取消U盘挂载成功[root@TX2440A /]# ls /mnt/udisk1注:上面的/udisk1目录可以是/mnt目录下的/nfs、/sd、/udisk1、/udisk2、/udisk3、/udisk4子目录中的任意一个,为了便于识别和不引起和别的存储器发送冲突,最好还是使用/udisk标识的目录
SD卡挂载命令SD卡插入的时候会显示启动信息,启动信息中mmcblk0: p1指SD卡的设备名为p1dev设备目录下有一个mmcblk0p1设备文件,此设备文件就是我们插入的SD卡,我们将这个设备文件挂载到Linux系统的/mnt/sd这个目录下,这样我们即可以通过访问/mnt/sd目录来读写SD卡,挂载用mount命令[root@TX2440A /]# mount /dev/mmcblk0p1 /mnt/sd
精简写法为mntsd,功能与mount /dev/mmcblk0p1 /mnt/sd 相同[root@TX2440A /]# mntsd进入到/mnt/sd目录下查看sd卡中的内容,如果内容与SD卡中的内容相同则说明SD卡挂载成功
[root@TX2440A /]# ls /mnt/sd
取消SD卡挂载命令取消挂载用umount命令,加上要取消挂载的目录/mnt/sd[root@TX2440A /]# umount /mnt/sd再查看/mnt/sd目录下发现已经没有内容了则说明取消SD卡挂载成功[root@TX2440A /]# ls /mnt/sd注:上面的/sd目录可以是/mnt目录下的/nfs、/sd、/udisk1、/udisk2、/udisk3、/udisk4子目录中的任意一个,为了便于识别和不引起和别的存储器发送冲突,最好还是使用/sd标识的目录怎么把u盘弄坏
[问题点数:100分,结帖人qwerqpalzm]
怎么把u盘弄坏
[问题点数:100分,结帖人qwerqpalzm]
只显示楼主
取消只显示楼主
匿名用户不能发表回复!|     提到DataGrid 不管是网页还是应用程序开发都会频繁使用。通过它我们可以灵活的在行与列间显示各种数据。本篇将详细介绍WPF 4 中DataGrid 的相关功能。
     默认情况下,当我们为DataGrid 控件设置ItemSource 属性后,DataGrid 会根据数据类型自动生成相应的列,下表列出DataGrid 支持的四种列及其数据类型。
     在创建DataGrid 时可以通过AutoGenerateColumns 属性设置列是否自动生成,从而加入自定义列。如果DataGrid 中同时包含“自动生成列”与“用户自定义列”,则首先创建“用户自定义列”。下面代码实例中分别创建这四种列:
&Window x:Class=&WPF4ControlTest.MainWindow&
xmlns=&http://schemas.microsoft.com/winfx/2006/xaml/presentation&
xmlns:x=&http://schemas.microsoft.com/winfx/2006/xaml&
xmlns:local=&clr-namespace:WPF4ControlTest&
xmlns:assembly=&clr-namespace:Sassembly=mscorlib&
Title=&MainWindow& Height=&200& Width=&500&&
&Window.Resources&
&ObjectDataProvider x:Key=&sexEnum& MethodName=&GetValues&
ObjectType=&{x:Type assembly:Enum}&&
&ObjectDataProvider.MethodParameters&
&x:Type Type=&local:SexOpt&/&
&/ObjectDataProvider.MethodParameters&
&/ObjectDataProvider&
&/Window.Resources&
&DataGrid x:Name=&dataGrid& ItemsSource=&{Binding}& AutoGenerateColumns=&False&&
&DataGrid.Columns&
&DataGridTextColumn Header=&Name& Width=&80& Binding=&{Binding Name}&/&
&DataGridTextColumn Header=&Age& Width=&50& Binding=&{Binding Age}&/&
&DataGridComboBoxColumn Width=&80& Header=&Sex&
SelectedItemBinding=&{Binding Sex}&
ItemsSource=&{Binding Source={StaticResource sexEnum}}&/&
&DataGridCheckBoxColumn Header=&Pass Exam?& Width=&100&
Binding=&{Binding Pass}&/&
&DataGridHyperlinkColumn Header=&Email& Width=&150&
Binding=&{Binding Email}&/&
&/DataGrid.Columns&
&/DataGrid&
     其中每列都包含各自的数值类型,在C# 中创建Member 类及SexOpt 枚举,并将memberData 数据绑定到DataGrid:
using System.W
using System.Collections.ObjectM
namespace WPF4ControlTest
/// &summary&
/// Interaction logic for MainWindow.xaml
/// &/summary&
public partial class MainWindow : Window
public MainWindow()
InitializeComponent();
ObservableCollection&Member& memberData = new ObservableCollection&Member&();
memberData.Add(new Member()
Name = &Joe&, Age = &23&, Sex = SexOpt.Male,
Pass = true, Email = new Uri(&mailto:&)
memberData.Add(new Member()
Name = &Mike&, Age = &20&,
Sex = SexOpt.Male, Pass = false,
Email = new Uri(&mailto:&)
memberData.Add(new Member()
Name = &Lucy&, Age = &25&,
Sex = SexOpt.Female, Pass = true,
Email = new Uri(&mailto:&)
dataGrid.DataContext = memberD
public enum SexOpt { Male, Female };
public class Member
public string Name { get; set; }
public string Age { get; set; }
public SexOpt Sex { get; set; }
public bool Pass { get; set; }
public Uri Email { get; set; }
这样我们就可以通过自定义列的方式创建出DataGrid:
     默认情况下,DataGrid 的选择模式为“全行选择”,并且可以同时选择多行(如下图所示),我们可以通过SelectionMode 和SelectionUnit 属性来修改DataGrid 的选择模式。
SelectionUnit:包含Cell、FullRow 和CellOrRowHeader 三种单元选择模式。
                         · Cell:选择单元格;
                         · FullRow:选择全行;
                         · CellOrRowHeader:可选择单元格,也可以通过点击行首选择全行;
SelectionMode:分为Extended 和Single 两种模式。
                           · Extended:选择多个单元(单元格或全行,由SelectionUnit 定义);
                           · Single:选择唯一单元(单元格或全行,由SelectionUnit 定义);
&DataGrid x:Name=&dataGrid& ItemsSource=&{Binding}& AutoGenerateColumns=&False&
SelectionUnit=&Cell& SelectionMode=&Extended&&… …
设置SelectionUnit 和SelectionMode 后的实例效果:
     默认情况下,我们可以直接在DataGrid 中编辑数据(下表为相关的编辑命令),当然也可以通过IsReadOnly 属性将DataGrid 设置为只读方式。
&DataGrid x:Name=&dataGrid& ItemsSource=&{Binding}& AutoGenerateColumns=&False&
SelectionUnit=&Cell& SelectionMode=&Extended& IsReadOnly=&True&&… …
、、、、、 、、
阅读(...) 评论()
Copyright & 2010 Gnie应用程序和硬件设备的通信过程是:应用程序使用CreateFile函数打开设备,然后用DeviceIoControl()与硬件设备通信.
CreateFile函数:
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
private static extern IntPtr CreateFile(
string lpFileName,
uint dwDesiredAccess,
uint dwShareMode,
IntPtr SecurityAttributes,
uint dwCreationDisposition,
uint dwFlagsAndAttributes,
IntPtr hTemplateFile);
DeviceIoControl函数:
[DllImport("kernel32.dll", ExactSpelling = true, SetLastError = true, CharSet = CharSet.Auto)]
private static extern bool DeviceIoControl(
IntPtr hDevice,
uint dwIoControlCode,
IntPtr lpInBuffer,
uint nInBufferSize,
IntPtr lpOutBuffer,
uint nOutBufferSize,
out uint lpBytesReturned,
IntPtr lpOverlapped
const uint GENERIC_READ = 0x;
const int GENERIC_WRITE = 0x;
const int FILE_SHARE_READ = 0x1;
const int FILE_SHARE_WRITE = 0x2;
const int IOCTL_STORAGE_EJECT_MEDIA = 0x2D4808;
具体过程如下:
& & &1. 打开设备,得到设备的句柄handle.
handle = CreateFile(filename, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, IntPtr.Zero, 0x3, 0, IntPtr.Zero);
第一个参数filename与普通文件名有所不同,设备驱动的&文件名&(常称为&设备路径&)形式固定为&\\.\DeviceName&, 如&string filename = @"\\.\I:";
& & 2. 向目标设备发送设备控制码,也就是发送命令。IOCTL_STORAGE_EJECT_MEDIA &弹出U盘。
uint byteR
DeviceIoControl(handle, IOCTL_STORAGE_EJECT_MEDIA, IntPtr.Zero, 0, IntPtr.Zero, 0, out byteReturned, IntPtr.Zero);
阅读(...) 评论()

我要回帖

更多关于 mac如何卸载软件 的文章

 

随机推荐