2013-03-06 23 views
11

Nguồn tài nguyên WPF - bao gồm kiểu, mẫu, v.v. - được tổ chức để tôi có thể sử dụng chúng trên Windows, Trang hoặc thậm chí là Dự án. Tôi có những tùy chọn nào để đạt được khả năng sử dụng lại tối đa tài nguyên của mình và cấu trúc có thể duy trì (ví dụ: một tệp cho mỗi Mẫu)?Cách sắp xếp tài nguyên (kiểu, ...) trong một kịch bản WPF phức tạp?

Ví dụ: Tôi đang tạo một ứng dụng WPF và tôi muốn sử dụng một TabControl, nhưng tôi muốn thực hiện những thay đổi lớn cho nó. Vì vậy, tôi có thể tạo một phong cách và áp dụng nó cho TabControl và TabItem. Đó là ok, nhưng nơi tôi có thể đặt tài nguyên của tôi để giữ cho XAML Window của tôi rõ ràng và có phong cách truy cập từ Windows khác hoặc các dự án là tốt?

Tôi thấy rằng tôi có thể thêm nó vào App.xaml nhưng đó chỉ là một giải pháp cho một dự án và cho phép chia sẻ ngay giữa các mục của dự án này. Ngoài ra, tôi nghĩ rằng sẽ tốt hơn nếu có những mẫu này tách biệt một chút so với mã khác, hơn là đặt tất cả trong một số trang hoặc app.xaml?

+0

Bạn có thể tạo ResourceDictionary và thêm nó vào một ClassLibrary. Bạn phải tham khảo nó trên App.xaml của bạn và bạn có thể sử dụng Thư viện trong nhiều dự án –

Trả lời

21

Tôi thường tạo một dự án tạo kiểu riêng biệt, mà tôi tham khảo từ các dự án mà tôi muốn tạo kiểu. Dự án phong cách có một cấu trúc cố định như thế này:

Styling project

Đối với mỗi kiểm soát, tôi tạo ra một phong cách ResourceDictionary. Ví dụ cho các nút của tôi:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Style x:Key="PrimaryButtonStyle" TargetType="Button"> 
    </Style> 

    <Style x:Key="ToolbarButton" TargetType="Button"> 
     <Setter Property="BorderThickness" Value="0" /> 
     <Setter Property="Margin" Value="3"/> 
     <Setter Property="Background" Value="Transparent"></Setter> 
    </Style> 
</ResourceDictionary> 

Trong một chính ResourceDictionary, tôi merge tất cả các từ điển khác, trong trường hợp này trong file IncaDesign.xaml, mà bạn có thể nhìn thấy trong hình trên:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:controls="clr-namespace:Commons.Controls;assembly=Commons"> 

    <ResourceDictionary.MergedDictionaries> 

     <ResourceDictionary Source="Converter/Converter.xaml" /> 
     <ResourceDictionary Source="Styles/Button.xaml" /> 
     <ResourceDictionary Source="BitmapGraphics/Icons.xaml" /> 

    </ResourceDictionary.MergedDictionaries> 

    <!-- Default Styles --> 
    <Style TargetType="Button" BasedOn="{StaticResource PrimaryButtonStyle}"></Style> 
</ResourceDictionary> 

Lưu ý cách tôi xác định kiểu mặc định, được áp dụng tự động, trừ khi bạn chỉ định khác. Trong mỗi cửa sổ hoặc điều khiển, mà bạn muốn tạo kiểu, bạn chỉ cần tham chiếu đến số này ResourceDictionary. Lưu ý nghĩa của nguồn, mà là một tham chiếu đến assembly (/Commons.Styling;component...)

<UserControl.Resources>   
    <ResourceDictionary>    
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="/Commons.Styling;component/IncaDesign.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary>   
</UserControl.Resources> 

phong cách mặc định sẽ được thiết lập tự động bây giờ, và nếu bạn muốn truy cập vào một tài nguyên một cách rõ ràng, bạn có thể làm điều này, sử dụng StaticResource.

<Viewbox Height="16" Width="16" Margin="0,0,10,0"> 
    <ContentControl Content="{StaticResource FileIcon32}" /> 
</Viewbox> 

Đây là giải pháp rất hay theo quan điểm của tôi, giải pháp này được xây dựng với PRISM.

+0

Hãy nhớ rằng các cá thể ResourceDictionary là tài nguyên nặng và bạn nên tránh chúng nếu có thể. [Xem VI.] (Http://pelebyte.net/blog/2011/07/11/twelve-ways-to-improve-wpf-performance/) –

+1

Điều quan trọng nhất là tránh tham chiếu chéo và kết hợp các từ điển không có hệ thống .Đây là những gì thực sự gây ra rắc rối, khi bạn tạo bản sao của tất cả các tài nguyên của bạn tất cả các thời gian, không phải là ResourceDictionary chính nó. Tôi nghĩ đây là vấn đề, bài viết bạn đã liên kết đang đề cập đến. Tôi không thấy cách tránh ResourceDictionaries trong một dự án phức tạp ... Và đây chính xác là ý tưởng của dự án tạo kiểu tóc: Để tránh kết hợp từ điển ở nhiều nơi ... – Marc

+0

Chính xác những gì tôi đang tìm :) Cảm ơn bạn. Tôi chỉ cần đọc thêm về những vấn đề có thể xảy ra với điều này. –

1

Bạn có thể tạo dự án có chứa Từ điển tài nguyên, trong giải pháp của bạn hoặc trong một giải pháp riêng biệt. Dự án của bạn sẽ là một loại Thư viện lớp và sau đó có thể dễ dàng được .dll tham chiếu từ bất kỳ dự án nào khác. Đây là một bài viết mô tả điều này: Resource Dictionary Article

Các vấn đề liên quan