Có gì đặc biệt về Generic.xaml?


153

Tôi đã cố gắng tìm ra cách tổ chức các tệp ResourceDipedia của mình để sử dụng lại và chia sẻ với các thành viên khác trong nhóm của tôi.

Tôi tiếp tục bắt gặp "Generic.xaml", nhưng nếu tôi tìm trên MSDN cho Generic.xaml hoặc chỉ cần tìm kiếm trên Google, tôi dường như chỉ nhận được các bài đăng trên blog và các câu hỏi diễn đàn để đề cập đến nó - tôi dường như không thể đánh vào bất cứ điều gì thực sự có thẩm quyền và rõ ràng.

Sự khác biệt giữa Generic.xaml và MyRandomlyNamedResourceDipedia.xaml là gì? Có vẻ như một trong hai cách, tôi phải tham chiếu ResourceDictionaries được lưu trữ trong các thư viện với thuộc tính Nguồn. Ví dụ,:

<Application.Resources>
    <ResourceDictionary
        Source="/CommonLibraryWpfThemes;component/Themes/Generic.xaml"
</Application.Resources>

Vậy Generic.xaml cung cấp lợi thế gì chính xác? Liệu nó có mục đích gì không nếu tôi không cố gắng cung cấp cho ứng dụng của mình nhiều "ngoại hình" (nghĩa là, nếu tôi chỉ có một chủ đề)?


6
Bạn không cần hợp nhất trong từ điển generic.xaml vào mã của mình, nếu bạn đang sử dụng nó với các điều khiển tùy chỉnh (trái ngược với điều khiển của người dùng).
Eternal21

Câu trả lời:


152

Mọi Điều khiển trong WPF đều có Kiểu mặc định cung cấp, trong số những thứ khác, mặc định của Điều khiển ControlTemplate. WPF tìm kiểu mặc định trong từ điển tài nguyên đặc biệt trong thư mục Chủ đề trong cùng cụm với điều khiển. Khóa cho kiểu mặc định được cung cấp bởiControl.DefaultStyleKey thuộc tính phụ thuộc, giá trị mặc định được ghi đè trong mỗi lớp con của Điều khiển.

Tên của từ điển tài nguyên phụ thuộc vào chủ đề Windows hiện tại, ví dụ như trên Vista sử dụng chủ đề Aero, từ điển được gọi là Aero.N normalColor.xaml, trên XP sử dụng chủ đề mặc định đó là Luna.N normalColor.xaml. Nếu kiểu không được tìm thấy trong từ điển chủ đề, nó sẽ tìm trong Generic.xaml tức là đối với các điều khiển có giao diện không phụ thuộc vào chủ đề.

Điều này chỉ áp dụng cho bất kỳ điều khiển tùy chỉnh nào bạn đã xác định, tức là các lớp có nguồn gốc từ Control, trực tiếp hoặc gián tiếp. Bạn có thể thay đổi kiểu mặc định cho điều khiển tiêu chuẩn bằng cách xuất phát từ nó và gọi DefaultStyleKeyProperty.OverrideMetadatahàm tạo tĩnh, nhưng sau đó bạn phải cung cấp kiểu đầy đủ bao gồm ControlTemplate.

Lưu ý rằng bạn có thể yêu cầu WPF tìm trong một cụm bên ngoài cho kiểu mặc định của bạn bằng cách sử dụng thuộc tính ThemeInfo. Việc lắp ráp bên ngoài phải được đặt tên <YourAssugging >. <ThemeName đậm, >ví dụ: PresententationFramework.Aero.dll.


Cảm ơn, Phil. Vì vậy, bạn có nói rằng nếu tôi chỉ muốn cung cấp ControlTemplate mới cho điều khiển Nút bình thường (nghĩa là không viết lớp đặc biệt của riêng tôi xuất phát từ Nút), thì đây có phải là một phần của "chủ đề" không?
devuxer

Có, nếu bạn chỉ muốn tạo lại mẫu hoặc định kiểu lại một điều khiển tiêu chuẩn, thì bạn sử dụng phần tử Tài nguyên thông thường ở UserControl / Window / Application / Dù ở mức nào. Bạn có thể sử dụng một kiểu với một khóa ẩn ( msdn.microsoft.com/en-us/l Library / Bt ) để thay đổi tất cả các điều khiển của một loại nhất định.
Phil Devaney

@Zaheylu Hiện đang hoạt động (Tôi nghĩ rằng MS đang cập nhật tài liệu của họ)
Alan McBee - MSFT

104

Để một generic.xamltệp (trường hợp không nhạy cảm) là một cái gì đó đặc biệt, phải đáp ứng hai điều kiện:

  • Nó phải nằm trong thư mục gốc của chủ đề trong dự án
  • Việc lắp ráp phải được đánh dấu bằng ThemeInfoAttribute(thường là trong AssemblyInfo.cs)

Sau đó, nó đóng vai trò là vị trí tra cứu mặc định cho bất kỳ kiểu mặc định nào bạn muốn áp dụng cho Điều khiển của mình. Cũng lưu ý rằng để một kiểu được mặc định, nó phải khai báo cả TargetType và x: Key là Kiểu điều khiển sẽ được tạo kiểu.

Nếu bạn muốn thêm toàn bộ chủ đề và chuyển đổi chủ đề vào ứng dụng của mình, điều đó được thực hiện bằng một số mã hóa, kỹ thuật này chỉ định nghĩa từ điển tài nguyên mặc định.


3
Bạn có thể làm rõ những gì bạn có nghĩa là "phong cách mặc định"? Điều này có nghĩa là tất cả các nút sẽ tự động thực hiện kiểu mà TargetType là "Nút"? Hay tôi vẫn cần tham khảo x:Keybằng cách viết <Button Style="{StaticResource MyButtonStyle}" />? Điều gì xảy ra nếu ResourceDipedia chứa nhiều hơn một Kiểu có TargetType là "Nút"? Cảm ơn.
devuxer

3
Một câu hỏi khác giúp tôi hiểu được vấn đề này: là Generic.xaml tương đương WPF của một tệp CSS xác định giao diện mặc định của các thành phần khác nhau, ví dụ : h1 {color:#00ff00}?
devuxer

3
Có, kiểu mặc định sẽ được áp dụng mà không tham chiếu rõ ràng khóa và hai kiểu giống nhau sẽ gây ra lỗi là có hai khóa giống nhau trong từ điển. Và vâng, bạn có thể nghĩ về nó theo cách đó, liên quan đến hành vi mặc định.
Kenan EK

3
Chỉ muốn thêm rằng, mặc dù đúng là có những hạn chế đặc biệt đối với chính tệp generic.xaml, mục từ điển trong generic.xaml có thể là một từ điển được hợp nhất mà các mục có thể tham chiếu bất cứ điều gì.
Tormod
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.