16

Tôi có một bộ điều khiển Silverlight, được gọi là "MySilverlightControls". Một vài thư mục nằm trong assembly đó tôi có một lớp mở rộng một cột lưới từ một nhà cung cấp bên thứ ba, chúng ta hãy gọi nó là "MyImageColumn.cs".Truy cập tài nguyênDịch vụ từ điển theo chương trình

Tôi cũng đã tạo một từ điển tài nguyên có tên là Generic.xaml, mục này nằm trong thư mục Themes của hội đồng. Trong đó điển tài nguyên i đã xác định một ControlTemplate gọi MyImageColumnTemplate:

<ControlTemplate x:Name="MyImageColumnTemplate" > 
    <Grid Margin="8,8,4,4" MaxHeight="32" MaxWidth="32"> 
     <Grid.Resources> 
      <localGrid:StatusColumnImageConverter x:Key="ImageContentConverter"/> 
     </Grid.Resources> 
     <Border Margin="5,5,0,0" Background="Black" Opacity="0.15" CornerRadius="5" /> 
     <Border Background="#FF6E6E6E" CornerRadius="4,4,4,4" Padding="4" Margin="0,0,5,5"> 
      <Border Background="White" CornerRadius="2,2,2,2" Padding="3"> 
       <Image Source="{Binding EditValue, Converter={StaticResource ImageContentConverter}}" Stretch="Uniform"/> 
      </Border> 
     </Border> 
    </Grid> 
</ControlTemplate> 

Câu hỏi của tôi là: từ MyImageColumn, làm thế nào tôi có thể lập trình tham khảo/tải kiểm soát mẫu này để tôi có thể gán nó vào một tài sản trên cột? Tôi hy vọng sẽ sử dụng cú pháp tương tự như sau:

ControlTemplate ct = (ControlTemplate)Application.Current.Resources["MyImageColumnTemplate"]; 

nhưng điều này luôn trả về giá trị rỗng. Khi tôi tải lắp ráp lên trong Reflector, tôi thấy rằng các tập tin Generic.xaml là có, tên của tài nguyên là MySilverlightControls.g.resources, và đường dẫn trong đó là themes/generic.xaml.

Tôi có thể truy cập chính xác các mục riêng lẻ trong từ điển tài nguyên này bằng cách nào?

Trả lời

30

Giải quyết vấn đề.

tôi cần phải:

  • tải từ điển tài nguyên của tôi
  • hợp nhất nó với các nguồn tài nguyên của ứng dụng
  • tải mẫu kiểm soát của tôi từ nguồn ứng dụng

Là một phần của tải tài nguyên từ điển, tôi cũng phải đăng ký lược đồ URI pack. Sau đó tôi đã phải đối phó với một số trường hợp ngoại lệ COM điên do lỗi nhẹ với xaml của tôi. Tôi cũng đã phải di chuyển xaml của tôi vào một tệp từ điển tài nguyên riêng biệt, cố gắng thực hiện nó thông qua generic.xaml giữ lỗi ném (mặc dù xaml là không có lỗi và có thể được nạp tiền bằng cách sử dụng tệp từ điển tài nguyên mới được tạo). Vì vậy, đơn giản hóa nó xuống, đây là mã:

if (!UriParser.IsKnownScheme("pack")) 
    UriParser.Register(new GenericUriParser(GenericUriParserOptions.GenericAuthority), "pack", -1); 

ResourceDictionary dict = new ResourceDictionary(); 
Uri uri = new Uri("/MySilverlightControls;component/themes/Dictionary1.xaml", UriKind.Relative); 
dict.Source = uri; 
Application.Current.Resources.MergedDictionaries.Add(dict); 
ControlTemplate ct = (ControlTemplate)Application.Current.Resources["MyImageColumnTemplate"]; 

Tôi đã đăng đầy đủ chi tiết về giải pháp này trong this blog post.

+2

Đã lưu tôi rất nhiều thời gian. Cảm ơn bạn rất nhiều vì bài đăng trên blog. Lam tôt lăm. – captonssj

+2

Chỉ cần lưu ý về lý do tại sao @slugster thực hiện hai dòng đầu tiên đó. Kiểu 'gói' Uri không được nạp và được đăng ký theo mặc định, gây ra' Uri uri = new Uri (bất kỳ chuỗi kiểu Uri nào), 'để ném một ngoại lệ. Cách đăng ký này ít xâm nhập vào mã của bạn hơn là đợi cho đến khi bạn đã tạo 'FrameworkElement' đầu tiên của mình trước khi cho phép bản thân sử dụng URI' pack'. –

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