Tổng quan về tài nguyên (Resource) trong WPF
Trong WPF, tài nguyên là những đối tượng không thực thi được lưu trữ trong ứng dụng, thường dùng để tách biệt dữ liệu giao diện khỏi logic xử lý. Các tài nguyên này được quản lý thông qua lớp ResourceDictionary — một từ điển với khóa và giá trị đều thuộc kiểu object. Do đó, bất kỳ đối tượng CLR nào có constructor mặc định và thuộc tính độc lập đều có thể được sử dụng làm tài nguyên, ví dụ như màu sắc, font chữ, chuỗi văn bản, hình ảnh hay animation.
Hai cách phổ biến để tham chiếu tài nguyên trong XAML là StaticResource và DynamicResource. Ngoài ra, x:Static lại phục vụ mục đích khác — truy cập các thành viên tĩnh từ mã C#.
StaticResource
- Thời điểm phân giải: Khi XAML được tải (thường trong quá trình khởi tạo giao diện).
- Hiệu năng: Cao hơn do giá trị được xác định sớm và cố định.
- Ứng dụng: Phù hợp với các tài nguyên không thay đổi trong suốt vòng đời ứng dụng.
DynamicResource
- Thời điểm phân giải: Trong thời gian chạy, mỗi khi giá trị được yêu cầu.
- Hiệu năng: Thấp hơn do phải tra cứu động trong từ điển tài nguyên.
- Ứng dụng: Dùng khi cần hỗ trợ thay đổi tài nguyên tại runtime, ví dụ như chuyển đổi giao diện (theme switching).
Cách sử dụng StaticResource
Tài nguyên có thể được khai báo ở nhiều nơi:
- Trong tệp tài nguyên riêng biệt (ví dụ:
Colors.xaml):<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <SolidColorBrush x:Key="MainColor" Color="#FF5722" /> </ResourceDictionary>Sử dụng trong cửa sổ chính:
<Window.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="Colors.xaml" /> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </Window.Resources> <Grid> <TextBlock Foreground="{StaticResource MainColor}" Text="Hello" /> </Grid> - Trực tiếp trong
Window.Resources:<Window.Resources> <SolidColorBrush x:Key="MainColor" Color="#FF5722" /> </Window.Resources> - Trong
App.xaml(toàn cục):<Application.Resources> <SolidColorBrush x:Key="MainColor" Color="#FF5722" /> </Application.Resources>Lưu ý: Tài nguyên định nghĩa ở cấp cửa sổ sẽ ghi đè tài nguyên cùng tên trong
App.xaml. - Trong
Style.Resources:<Style TargetType="Button"> <Style.Resources> <SolidColorBrush x:Key="BtnTextColor" Color="White" /> </Style.Resources> <Setter Property="Foreground" Value="{StaticResource BtnTextColor}" /> </Style>
Thứ tự tìm kiếm StaticResource
Khi một tài nguyên được tham chiếu bằng StaticResource, WPF tìm theo thứ tự sau:
- Từ điển tài nguyên của phần tử đang sử dụng.
- Di chuyển lên cây logic đến các phần tử cha, cho đến gốc (
WindowhoặcUserControl). - Tài nguyên toàn cục trong
Application.Resources(App.xaml).
x:Static là gì?
x:Static không liên quan đến ResourceDictionary. Nó dùng để truy cập trực tiếp các thành viên tĩnh (static fields, properties, constants, enums) từ lớp C# trong XAML.
Ví dụ, định nghĩa lớp:
public static class AppConstants
{
public const string WindowTitle = "WPF Demo";
}
Sử dụng trong XAML (giả sử namespace cục bộ là local):
<Window Title="{x:Static local:AppConstants.WindowTitle}">
...
</Window>
Minh họa sự khác biệt giữa StaticResource và DynamicResource
Xét đoạn XAML sau:
<Window.Resources>
<SolidColorBrush x:Key="ThemeBrush" Color="Green" />
</Window.Resources>
<StackPanel>
<TextBlock Text="Static" Foreground="{StaticResource ThemeBrush}" />
<TextBlock Text="Dynamic" Foreground="{DynamicResource ThemeBrush}" />
<Button Content="Đổi màu" Click="ChangeColor_Click" />
</StackPanel>
Với xử lý sự kiện:
private void ChangeColor_Click(object sender, RoutedEventArgs e)
{
Resources["ThemeBrush"] = new SolidColorBrush(Colors.Purple);
}
Khi nhấn nút, chỉ TextBlock dùng DynamicResource mới thay đổi màu. Phần tử dùng StaticResource vẫn giữ nguyên giá trị ban đầu.