TOC

This article has been localized into Vietnamese by the community.

Hộp thoại:

Hộp thoại mở file - OpenFileDialog

Mỗi khi bạn muốn mở hay lưu file trên bất kì ứng dụng Windows nào, bạn sẽ nhìn thấy các hộp thoại tương tự nhau làm việc đó. Vì lí do đó mà hộp thoại mở và lưu file là những phần không thể thiếu của các Windows API và vì vậy, chúng ta có thể truy cập và phát triển trên nền tảng Windows.

Đối với WPF, bạn sẽ tìm thấy hộp thoại cơ bản cho mở và lưu file trong namespace Microsoft.Win32. Trong chủ đề này, chúng ta sẽ đề cập tới lớp OpenFileDialog, hộp thoại hỗ trợ hiển thị để mở một hay nhiều file.

Ví dụ OpenFileDialog đơn giản

Bắt đầu với việc dùng OpenFileDialog mà không có bất kí lựa chọn hỗ trợ nào khác, để mở file và đưa nội dung vào TextBox:

<Window x:Class="WpfTutorialSamples.Dialogs.OpenFileDialogSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="OpenFileDialogSample" Height="300" Width="300">
    <DockPanel Margin="10">
        <WrapPanel HorizontalAlignment="Center" DockPanel.Dock="Top" Margin="0,0,0,10">
            <Button Name="btnOpenFile" Click="btnOpenFile_Click">Open file</Button>
        </WrapPanel>
        <TextBox Name="txtEditor" />
    </DockPanel>
</Window>
using System;
using System.IO;
using System.Windows;
using Microsoft.Win32;

namespace WpfTutorialSamples.Dialogs
{
	public partial class OpenFileDialogSample : Window
	{
		public OpenFileDialogSample()
		{
			InitializeComponent();
		}

		private void btnOpenFile_Click(object sender, RoutedEventArgs e)
		{
			OpenFileDialog openFileDialog = new OpenFileDialog();
			if(openFileDialog.ShowDialog() == true)
				txtEditor.Text = File.ReadAllText(openFileDialog.FileName);
		}
	}
}

Một khi bạn chọn nút bấm Open, hộp thoại OpenFileDialog sẽ được khởi tạo và hiện lên. Tùy thuộc vào phiên bản Windows bạn đang dùng là nền được chọn, nó sẽ thấy tương tự như sau:

ShowDialog() sẽ trả về giá trị true, false hay null. Nếu người dùng chọn file và chọn "Open", kết quả là true, trong trường hợp đó, chúng ta sẽ mở và đưa nội dung file vào TextBox. Chúng ta sẽ có đường dẫn của file được chọn bằng cách sử dụng thuộc tính FileName của OpenFileDialog.

Bộ lọc

Thông thường, khi bạn muốn người dung mở file trên ứng dụng của bạn, bạn sẽ muốn giới hạn loại file được chọn. Ví dụ, Word mở file Word ( với phần mở rộng là .doc hay .docx) và Notepad mở file text (với phần mở rộng là .txt).

Bạn có thể tạo bộ lọc cho OpenFileDialog để xác định lại file mà người dùng nên chọn mở trong ứng dụng của bạn, cũng như giới hạn file được hiển thị để có cái nhìn rõ và tổng quan hơn khi chọn file. Vấn đề này sẽ được giải quyết với thuộc tính Filter. Chúng ta sẽ xem trong ví dụ sau và xem cách khởi tạo đúng filter vào hộp thoại. Hãy xem ví dụ:

openFileDialog.Filter = "Text files (*.txt)|*.txt|All files (*.*)|*.*";

Đây là kết quả:

Chú ý là hộp thoại giờ đây có combo box cho chọn loại file. Các file được hiển thị sẽ giới hạn vào lựa chọn của combo box đó.

Định dạng cho bộ lọc có vẻ có chút lạ lẫm ở lần đầu tiên nhưng hoạt động theo định nghĩa mà con người có thể đọc được và máy tính có thể xem và lựa chọn, phân cách với kí tự pipe (|). Nếu bạn muốn nhiều hơn một loại file, chúng ta có thể làm như ví dụ sau, mỗi tập thông tin sẽ được phân cách với kí tự pipe.

Để tổng quát lại, chúng ta sẽ hiểu như sau: Phần thứ nhất, chúng ta muốn loại file được đặt tên là "Text files (*.txt)" (phần mở rộng đặt trong dấu ngoặc đơn để dễ hiểu, vì vậy có thể hiểu định dạng nào được bao gồm) và phần thứ hai sẽ báo cho hộp thoại hiển thị những file có phần mở rộng là .txt:

Text files (*.txt)|*.txt

Mỗi loại file có thể gồm nhiều định dạng mở rộng khác nhau. Ví dụ như file hình ảnh có thể gồm cả file JPEG và PNG file, ta có thể xem như sau:

openFileDialog.Filter = "Image files (*.png;*.jpeg)|*.png;*.jpeg|All files (*.*)|*.*";

Ngăn cách giữa các định dạng mở rộng là dấu chấm phẩy (;) ở phần thứ hai (dành cho máy tính). Ở phần thứ nhất, bạn có thể định dạng như thế nào bạn muốn nhưng phần lớn các devs muốn có sự giống nhau giữa các phần như ví dụ trên.

Cấu hình đường dẫn ban đầu

Đường dẫn ban đầu (initial directory) được dùng bởi OpenFileDialog tùy thuộc vào Windows. Tuy nhiên với thuộc tính InitialDirectory , bạn có thể thay đổi, ghi đè( override) lên nó. Bạn sẽ muốn đặt giá trị này tới đường dẫn đặc trưng của người dùng, đường dẫn của ứng dụng hay đường dẫn lần sử dụng gần nhất. Bạn sẽ đặt giá trị này với định dạng chuỗi (string) như sau:

openFileDialog.InitialDirectory = @"c:\temp\";

Nếu bạn muốn dùng một trong những thư mục đặc trưng của Windows như Desktop, My Documents hay Program Files, bạn cần đặc biệt chú ý rằng các thư mục này sẽ có sự khác biệt tùy thuộc vào từng phiên bản Windows và người dùng nào đang sử dụng Windows đó. .Net framework có thể giúp bạn điều đó, chỉ cần sử dụng lớp Environment và các thuộc tính con của nó để dẫn tới thư mục cần thiết:

openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

Trong trường hợp này, chúng ta lấy đường dẫn thư mục My Documents, hãy xem vào danh sách liệt kê SpecialFolder, nó bao gồm rất nhiều các giá trị đường dẫn thú vị. Để xem đầy đủ hơn, bạn hãy xem Chủ đề MSDN này.

Nhiều file

Nếu ứng dụng của bạn hỗ trợ mở nhiều file hay đơn giản bạn muốn dùng OpenFileDialog mở nhiều hơn một file một lần, bạn sẽ cần mở thuộc tính Multiselect. Trong ví dụ tiếp theo, chúng ta sẽ làm việc đó và chúng ta sẽ đưa tất cả các công nghệ đề cập ở trên bao gồm bộ lọc và cấu hình đường dẫn ban đầu vào đó:

<Window x:Class="WpfTutorialSamples.Dialogs.OpenFileDialogMultipleFilesSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="OpenFileDialogMultipleFilesSample" Height="300" Width="300">
    <DockPanel Margin="10">
        <WrapPanel HorizontalAlignment="Center" DockPanel.Dock="Top" Margin="0,0,0,10">
            <Button Name="btnOpenFile" Click="btnOpenFiles_Click">Open files</Button>
        </WrapPanel>
        <ListBox Name="lbFiles" />
    </DockPanel>
</Window>
using System;
using System.IO;
using System.Windows;
using Microsoft.Win32;

namespace WpfTutorialSamples.Dialogs
{
	public partial class OpenFileDialogMultipleFilesSample : Window
	{
		public OpenFileDialogMultipleFilesSample()
		{
			InitializeComponent();
		}

		private void btnOpenFiles_Click(object sender, RoutedEventArgs e)
		{
			OpenFileDialog openFileDialog = new OpenFileDialog();
			openFileDialog.Multiselect = true;
			openFileDialog.Filter = "Text files (*.txt)|*.txt|All files (*.*)|*.*";
			openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
			if(openFileDialog.ShowDialog() == true)
			{
				foreach(string filename in openFileDialog.FileNames)
					lbFiles.Items.Add(Path.GetFileName(filename));
			}
		}
	}
}

Nếu bạn kiểm tra code này, bạn sẽ thấy giờ đây có thể lựa chọn nhiều file trong cùng một đường dẫn với cách giữ Ctrl hay Shift và chọn với chuột. Một khi đã xong, ví dụ này sẽ thêm tên file vào ListBox bằng cách lặp thuộc tính FileNames.

Tổng kết

Như bạn đã thấy, sử dụng OpenFileDialog trong WPF rất dễ dàng và có thể làm rất nhiều thứ cho bạn. Tuy nhiên, hãy chú ý giản số lượng dòng code, trong ví dụ này, chúng ta vẫn chưa bắt lỗi. Khi làm việc với file thật sự và sử dụng với nhiệm vụ (task) IO thông thường, bạn sẽ cần phải chú ý bắt lỗi như khi file bị khóa hay không tồn tại đường dẫn, các vấn đề liên quan, ...


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!