2012-11-01 22 views
7

tôi giữ nguồn ứng dụng của tôi trong một DLL riêng biệt và tham khảo chúng trong EXE chính của tôi sử dụng một cái gì đó như thế này trong App.xaml: -WPF đã hợp nhất các từ điển tài nguyên trong mọi điều khiển người dùng - ý tưởng tồi?

<ResourceDictionary.MergedDictionaries> 
    <ResourceDictionary Source="pack://application:,,,/MyThemesAssembly;component/Themes/Generic.xaml"/> 
</ResourceDictionary.MergedDictionaries> 

Khi tôi chỉnh sửa một cửa sổ đó là trong dự án EXE chính, nhà thiết kế VS2010 không nhận ra bất kỳ tài nguyên nào từ assembly khác, vì vậy tôi không thấy bất kỳ kiểu dáng nào được áp dụng (không thực sự là vấn đề vì tôi luôn làm việc trong khung nhìn XAML). Tuy nhiên Resharper cũng không nhận ra những tên tài nguyên bên ngoài này, dẫn đến rất nhiều sự nguệch ngoạc dưới tên tài nguyên khi tôi đang chỉnh sửa XAML.

Tôi thấy rằng tôi có thể sửa cả thiết kế VS và Resharper bằng cách bao gồm XAML ở trên trong mỗi cửa sổ và điều khiển người dùng, nhưng điều này sẽ có ảnh hưởng xấu đến bộ nhớ và/hoặc hiệu suất không? Mỗi cửa sổ sẽ nhận được một bản sao tài nguyên riêng biệt?

+0

Vâng, các lỗi trong IDE và các công cụ không ảnh hưởng đến mã của bạn. Bên cạnh đó, bao gồm các từ điển tài nguyên trong mỗi và mọi điều khiển là một cách dễ bị lỗi (nếu bạn quyết định đổi tên từ điển? Để thêm từ điển khác?). – Vlad

+0

Tuy nhiên, tôi sẽ cố gắng thêm một quirk làm việc xung quanh vấn đề trong chế độ thiết kế. (Có lẽ điều này sẽ giúp: 'public class MyUserControlBase: UserControl {public MyUserControlBase() {if (DesignerProperties.GetIsInDesignMode (this)) LoadExternalDictionariesExplicitlyHere(); ...') – Vlad

+1

@Vlad Tôi đã học cách sống với những khúc khích - cái này cách tiếp cận sửa chữa Resharper thực sự chỉ là một "tốt đẹp để có". Tôi không nghĩ rằng đổi tên/thêm tài nguyên sẽ là một vấn đề - trong ví dụ XAML của tôi ở trên, "Generic.xaml" tự kết hợp một tải các tài nguyên khác trong hội đồng đó, vì vậy thật dễ dàng để thêm các tài nguyên mới. Tôi quan tâm nhiều hơn về việc bao gồm đó trong mỗi cửa sổ sẽ thổi bộ nhớ/hiệu suất của ứng dụng (hay VS2010). –

Trả lời

2

Hãy thử sử dụng VS2012.

tôi có một dự án thử nghiệm mà tôi đã sử dụng mà tôi đang làm từ điển tài nguyên sáp nhập từ một lắp ráp bên ngoài và trong App.xaml tôi có điều này:

<Application x:Class="WpfPackDictionaries.App" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      StartupUri="MainWindow.xaml"> 
    <Application.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="pack://application:,,,/WPFCommonLibrary;component/Vectors/Vectors.xaml"/> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    </Application.Resources> 
</Application> 

Sau đó, trong mainwindow.xaml của tôi, tôi có điều này nơi con đường kéo trong một ModifiablePathStyle phong cách:

<Window xmlns:Control="clr-namespace:WPF.Common.Control;assembly=WPFCommonLibrary" x:Class="WpfPackDictionaries.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 

    <Grid> 
     <Path Style="{StaticResource ModifiablePathStyle}" Fill="Red"/> 
     <Control:Jabberwocky /> 
    </Grid> 
</Window> 

Intellisense/Resharper (v7.1 10/31 (sớm truy cập Build)) công nhận kiểu dáng và tôi không có squigglies:

enter image description here

Do đó bạn đã cố gắng làm việc trong VS2012 chưa?

+0

Chúng tôi sẽ chuyển sang VS2012 cuối cùng, nhưng vẫn đang đợi việc quản lý $$$! –

+0

@AndrewStephens Tất cả các công việc tốt nhất được thực hiện trong sự quan tâm của quản lý. ;-) – OmegaMan

+0

@AndrewStephens Sử dụng phiên bản VS2012 Express cho công việc xaml của bạn. Nó vẫn có thể biên dịch .Net 3.5/4.0 dự án không thay đổi dự án .prj hoặc .sln. – OmegaMan

3

Chúng tôi đã gặp sự cố trong ứng dụng của chúng tôi với việc sử dụng ResourceDictionaries được tham chiếu trong mỗi UserControl/View. Tôi khuyên chống lại điều đó. Chúng tôi đã quản lý để giảm dung lượng bộ nhớ của ứng dụng bằng 300 mb bằng cách sử dụng SharedResourceDictionaries. Tôi có vẻ như bạn sẽ kết thúc với ResourceDictionary được instantiated một lần cho mỗi UserControl duy nhất trong ứng dụng của bạn. Đừng làm điều đó chỉ để sửa VS designer.

2

VS2012 có thể 'xem' tài nguyên vì VS XAML thiết kế tải và thực thi mã của bạn trong thời gian thiết kế, vì vậy VS có thể kiểm tra tài nguyên nào sẽ có sẵn khi chạy. ReSharper không bao giờ sử dụng thực thi mã thời gian thiết kế (vì điều này đòi hỏi mã của bạn luôn ở trong trạng thái có thể biên dịch) nên việc hỗ trợ XAML trở thành một nhiệm vụ phức tạp hơn một chút.

ReSharper 8.0 đã triển khai hỗ trợ cho việc giải mã BAML và trích xuất danh sách các tệp XAML và giải quyết tài nguyên XAML từ các tập hợp nhị phân tham chiếu.

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