2009-02-23 33 views
10

Tôi có một ứng dụng Windows Forms cần lưu trữ một điều khiển WPF khi chạy. Tôi có lưu trữ cơ bản và tương tác hoàn chỉnh (sử dụng một điều khiển ElementHost) và mọi thứ hoạt động tốt cho đến khi tôi cố gắng làm điều gì đó yêu cầu điều khiển WPF sử dụng một số từ điển tài nguyên tùy chỉnh được xác định. (Việc kiểm soát WPF và tất cả của nó là từ điển tài nguyên được tất cả các định nghĩa trong thư viện cùng WPF kiểm soát DLL.)Tải/Sử dụng Từ điển Tài nguyên từ một điều khiển WPF được lưu trữ trên máy chủ WinForms

Ngay sau khi điều đó xảy ra, tôi nhận được một loạt các lỗi mà trông như thế này:

System.Windows.ResourceDictionary Warning: 9 : Resource not found; ResourceKey='DocumentHeaderInterestStyle' 

Tôi đã tìm thấy một liên kết reference (xuất hiện đã chết do lưu trữ, thiscó thể là cùng một bài viết ban đầu được tham chiếu). nói về điều này, nhưng có vẻ như bài viết đang tiếp cận nhiều hơn từ phía WPF, nhưng tôi không thực sự muốn thay đổi điều khiển WPF vì mọi thứ hoạt động trong một ứng dụng WPF độc lập. Nếu cách duy nhất để thực hiện điều này là thực hiện thay đổi ở phía WPF, tôi có thể thực hiện những thay đổi đó (Tôi không chịu trách nhiệm đối với thư viện điều khiển WPF nhưng người đó cũng làm việc cho cùng một công ty để nó không phải là một vấn đề khác hơn là nhận được thời gian của mình để thực hiện các thay đổi.) Nhưng tôi hy vọng cho một cái gì đó tôi có thể làm ở phía WinForms để có được điều này làm việc.

Thư viện kiểm soát WPF có một tập tin từ điển tài nguyên có tên là "Default.xaml" quy định tại dự án với các thuộc tính sau:

Build Action: Trang Copy to Output Directory: Đừng sao chép Tuỳ chỉnh Tool: MSBuild : Biên dịch

các độc lập WPF ứng dụng có các mục sau đây trong nó App.xaml file:

<ResourceDictionary x:Uid="ResourceDictionary_1"> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary x:Uid="ResourceDictionary_2" Source="/SmartClient.Infrastructure;component/Themes\Default.xaml"/> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 

nó có vẻ như thư viện kiểm soát nên đã biết cách t o lấy tài nguyên của nó. Sử dụng Resources.MergedDictionaries.Add() có vẻ như nó sẽ hoạt động, nhưng tôi lấy ví dụ của từ điển hiện tại ở đâu?

Trả lời

4

Giả sử bạn biết những tài nguyên nào bạn cần (giống như bạn làm), bạn chỉ nên tự mình "tự mình tiêm" chúng. Một cái gì đó như:

var wpfControl = new ...; 
wpfControl.Resources.Add(...); 
elementHost.Child = wpfControl; 

Trong câu hỏi của bạn, bạn đề cập rằng có các từ điển tài nguyên hiện có trong thư viện điều khiển. Nếu vậy, bạn chỉ có thể làm điều này:

var wpfControl = new ...; 
wpfControl.Resources.MergedDictionaries.Add(/* instance of existing dictionary */); 
elementHost.Child = wpfControl; 
+2

đâu sẽ là "chìa khóa" và "giá trị" đến từ các cuộc gọi đến Thêm? –

+0

Điều đó có ý nghĩa hơn, nhưng không nên sử dụng các từ điển? Tôi đã cập nhật câu hỏi của tôi với một số thông tin thêm về cách thức WPF bên của những thứ trông. –

+0

Bạn đang rung chuyển, nó làm việc kỳ diệu. Bạn thực sự đã tiết kiệm thời gian của tôi. –

1

Đối với từ điển tài nguyên tải được nhúng vào assembly, tôi đã sử dụng đoạn mã sau cho tải chúng trong thời gian chạy:

//using System.Windows 
ResourceDictionary dict = new ResourceDictionary(); 
dict.Source = new Uri("MyResourceDictionary.xaml", UriKind.Relative); 

Application.Current.Resources.MergedDictionaries.Add(dict); 

sẽ này cũng làm việc để tải một từ điển trong thư mục thực thi.

0

Giả sử bạn có kiểu/mẫu/tài nguyên được chia thành nhiều tệp Resources1.xamlResources2.xaml bạn có thể tổng hợp chúng thành một từ điển tài nguyên đơn lẻ (AllResources.xaml). Từ điển tài nguyên có thể dễ dàng được thêm vào một điều khiển trong tệp xaml của điều khiển. Xem ví dụ bên dưới.

(!) Set Resources1.xaml, Resources2.xamlAllResources.xaml xây dựng hành động để Page

Resources1.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 

    <ControlTemplate x:Key="ScrollViewerControlTemplate" TargetType="{x:Type ScrollViewer}"> 
     ... 
    </ControlTemplate> 

    <LinearGradientBrush x:Key="VerticalScrollBarBackground" EndPoint="1,0" StartPoint="0,0"> 
     ... 
    </LinearGradientBrush> 

    <Style x:Key="StyleA" TargetType="{x:Type ScrollBar}"> 
     ... 
    </Style> 

</ResourceDictionary> 

Resources2.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 


    <Style x:Key="StyleB" TargetType="{x:Type ScrollBar}"> 
     ... 
    </Style> 

    <Style x:Key="StyleC" TargetType="{x:Type TextBlock}"> 
     ... 
    </Style> 

</ResourceDictionary> 

AllResources.xaml

Thêm nguồn tài nguyên như các từ điển tương đường đến AllResources.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> 
    <ResourceDictionary.MergedDictionaries> 
     <ResourceDictionary Source="Resources1.xaml" /> 
     <ResourceDictionary Source="Resources2.xaml" /> 
    </ResourceDictionary.MergedDictionaries> 
</ResourceDictionary> 

Cuối cùng trong UserControl của bạn

<UserControl.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="pack://application:,,,/projectName;component/PathToTheFileRelativeToProjectRootDirectory/AllResources.xaml 
     <converters:StringToUpperCaseConverter x:Key="StringToUpperCaseConverter" /> 
     <converters:LocalizationEntryToStringCaseConverter x:Key="LocalizationEntryToStringCaseConverter" /> 
    </ResourceDictionary> 
</UserControl.Resources> 
Các vấn đề liên quan