2010年3月21日 星期日

Silverlight 4中的檔案拖曳支援

在Silverlight 4當中,針對拖曳的行為也有相當令人激賞的增強,這同時也讓Silverlight中OOB應用程式所能達成的效果又向傳統的WindowsForm應用程式逼近了一大步。

過去我們已經可以透過程式碼在Silverlight應用程式的畫面中讓物件(element)們被拖曳,現在在Silverlight 4當中,我們甚至可以把實體檔案拖曳到瀏覽器上正在執行的Silverlight應用程式中。

Silverlight 4當中,針對所有的UIElement物件,增加了一個AllowDrop屬性,您可以直接將其設定為True:
< name="textBox1" fontsize="16" acceptsreturn="True" allowdrop="True" />
如此一來,該物件將被允許接收拖曳的檔案,也就是說,您可以從桌面、檔案總管等位置,把一個或多個檔案拖曳到剛才你指定AllowDrop為True的Silverlight物件上:

這樣還不夠,這只是將控制項設定為可以接受檔案而已,當檔案被拖曳到物件上之後,我們還需要去開啟它,並且透過程式碼來做一些額外的處理,例如開檔、顯示…等動作。

我們可以在控制項的Drop事件中來處理檔案的開啟與讀取動作:
private void textBox1_Drag(object sender, DragEventArgs e)
{
if (e.Data == null) return;
//從e.Data取得資料物件
IDataObject DataObject = e.Data as IDataObject;
//取得檔案(集合,可能有多個檔案)
System.IO.FileInfo[] files = (System.IO.FileInfo[])DataObject.GetData(DataFormats.FileDrop);

//列舉每一個檔案
foreach (System.IO.FileInfo item in files)
{
//如果檔名為*.txt
if (item.Extension.Equals(".txt"))
{
//則開檔
using (System.IO.Stream stream = item.OpenRead())
{
using (System.IO.StreamReader reader = new System.IO.StreamReader(stream, System.Text.UnicodeEncoding.Unicode ))
{
//讀取並填入TextBox中
this.textBox1.Text = reader.ReadToEnd();
}
}
return; //僅處理第一個
}
else
{
MessageBox.Show("請拖曳文字檔!");
}
}
}

在上面的程式碼中,你會看到我們我們透過Drag事件的參數『e.Data』可以取得檔案物件,由於物件可能是個檔案集合(使用者一次拖曳了多個檔案),因此我們將其轉為System.IO.FileInfo[]型別,接著透過foreach取得物件內容即可,上面的範例可以在TextBox中顯示使用者拖曳到畫面上的文字檔(不過需要注意其編碼,上面的範例支援Unicode格式的文檔。
[範例測試]

1 則留言:

提到...

請問David老師:

我在Win7上使用VS2010開發這個功能,但是用IE8運行的時候會一直出現"不允許檔案作業。拒絕存取路徑"的錯誤,是IE8還需要開啟哪些設定嗎?
而我如果以管理者權限開啟IE8時,物件就完全偵測不到拖曳的動作了?不知道為什麼?