2009-03-06 27 views
51

Tôi có một số DataTemplate được xác định trong tệp xaml mà tôi muốn truy cập thông qua mã C#. Bất cứ ai có thể vui lòng cho tôi biết làm thế nào tôi có thể truy cập nó? Tôi đã thêm một tệp ResourceDictionary mới và tên của nó là Dictionary1.xaml. Tôi có một mẫu dữ liệu như:Làm cách nào tôi có thể truy cập ResourceDictionary trong wpf từ mã C#?

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <DataTemplate x:Key="mytemplate"> 
     <TextBlock Text="Name:" Background="Blue"/> 
    </DataTemplate> 
</ResourceDictionary> 

không Tôi có một ListBox gọi listBox1 và tôi muốn gán nó vào nó Itemtemplate tài sản nhưng tôi không nhận được như thế nào tôi có thể làm điều đó?

Trả lời

50

ở đâu chính xác là bạn xác định nó?

Nếu bạn định nghĩa nó trong ResourceDictionary của đối tượng của bạn, sau đó

Application.Current.Resources[typeof(yourDataTemplateTargetType)] 

nên làm việc. Nếu bạn định nghĩa nó như là một thành viên của một cái gì đó khác, như nói, một ItemsControl, bạn cần phải có một xử lý đối với cá thể ItemsControl và gọi thuộc tính ItemTemplate.

Chỉnh sửa: Ok, tôi nghĩ chúng ta đang ở đâu đó. Vì vậy, bạn đang xác định một ResourceDictionary trong tập tin riêng của mình. Trước khi bạn có thể sử dụng nó trong giao diện người dùng của bạn và truy cập nó từ mã của bạn phía sau, bạn cần phải hợp nhất ResourceDictionary đó vào ứng dụng của bạn. Có phải bạn đang làm thứ này?

Nếu có, thì bước tiếp theo là lấy tài nguyên này. Mỗi FrameworkElement có một phương thức được gọi là FindResource. Phương pháp này là rất tốt vì nó đi lên cây ResourceDictionary và cố gắng định vị tài nguyên bằng khóa. Vì vậy, nếu bạn muốn truy cập tài nguyên này từ một UserControl, bạn có thể làm như sau trong các mã sau:

FindResource(typeof(yourDataTemplateTargetType)); 

Nếu điều này không làm việc cho bạn, xin vui lòng cho chúng tôi thấy chính xác cách thức bạn đang tuyên bố từ điển cập khu vực này và cách nó được hợp nhất vào tài nguyên của ứng dụng của bạn.

+1

Tôi không hiểu. Câu trả lời này không sử dụng chìa khóa. –

+0

FindResource lấy một đối số, khóa. typeof (yourDataTemplateTargetType) là khóa trong ví dụ này. –

+0

Xin chào. Điều gì sẽ xảy ra nếu khóa không phải là một Loại, nhưng một chuỗi như trong ví dụ của OP? –

7

Nếu bạn ví dụ có một mẫu cho Button trong từ điển tài nguyên của bạn trong App.xaml nộp bạn có thể truy cập nó bằng cách sử dụng đoạn mã sau:

Application.Current.Resources[typeof(Button)] 
46

Kể từ Application.Current là null trong trường hợp của tôi, tôi đã kết thúc bằng cách sử dụng này:

var myResourceDictionary = new ResourceDictionary(); 
    myResourceDictionary.Source = 
     new Uri("/DllName;component/Resources/MyResourceDictionary.xaml", 
       UriKind.RelativeOrAbsolute); 

và sau đó nhận được chìa khóa định tôi cần bằng cách sử dụng myResourceDictionary["KeyName"] as TypeOfItem

(source)

+2

Cá nhân tôi nghĩ đây là cách tiếp cận tốt nhất, như thể bạn định nghĩa nó trong thư viện hay ở bất kỳ đâu, nó vẫn hoạt động, khi câu trả lời được chấp nhận, bạn phải hợp nhất tất cả các từ điển vào ứng dụng của mình. hoặc không khả thi. –

+0

Bạn có thể giải thích tại sao sử dụng var thay vì ResourceDictionary – Venkat

+0

@Venkat tôi khuyên bạn nên xem [đây] (http://stackoverflow.com/questions/1873873/why-does-resharper-want-to-use -var-cho-tất cả mọi thứ) và ghi nhớ - đây không phải là phải :-) – itsho

1

Bạn có thể truy cập từ điển tài nguyên mà bạn đã thêm vào dự án của mình như sau:

var rd = new ResourceDictionary(); 
rd.Source = new Uri("ms-appx:///Dictionary1.xaml"); 

Sau đó, bạn có thể truy cập vào một tài nguyên lưu trữ trong từ điển tài nguyên như vậy:

someObject.Property = rd["mytemplate"]; 

LƯU Ý:
Bạn sẽ phải thay đổi URI vào từ điển tài nguyên theo vị trí mà bạn tạo ra nó liên quan đến thư mục cơ sở của dự án.

0

Bất kỳ phương pháp trên việc nhận được các nguồn lực dựa trên vị trí, nếu bạn đang theo dõi MVVMm tôi sẽ khuyên bạn nên làm theo cách này:

  1. tạo ra một dịch vụ như ProvideDataTemplateService, (để tạo ra một dịch vụ kế thừa thông thường từ Hành vi)
  2. Sử dụng vùng chứa Lựa chọn của bạn để tiêm dịch vụ này nơi bạn muốn có aces vào DataTemple.
Các vấn đề liên quan