7

Tôi đang cố gắng tìm hiểu cách áp dụng một chủ đề theo chương trình khi chạy trong ứng dụng Silverlight 4 của chúng tôi. Tôi đã tìm ra điều này sẽ đơn giản như tải một từ điển tài nguyên từ XAML và hợp nhất nó với các từ điển hợp nhất của ứng dụng. Dưới đây là mã của tôi cho đến nay:Tại sao XamlReader.Load không thể nhận ra thuộc tính đính kèm của tôi trong Silverlight 4?

var themeUri = new Uri(
    "OurApp;component/Themes/Classic/Theme.xaml", UriKind.Relative); 
var resourceInfo = GetResourceStream(themeUri); 
using (var stream = resourceInfo.Stream) 
{ 
    using (var reader = new StreamReader(stream)) 
    { 
     var xamlText = reader.ReadToEnd(); 
     var dict = XamlReader.Load(xamlText) as ResourceDictionary; 
     Resources.MergedDictionaries.Add(dict); 
    } 
} 

Thật không may, một XamlParseException được nâng lên trong suốt cuộc gọi đến XamlReader.Load:

Thuộc tính gắn thêm 'Foo' không được tìm thấy trong loại 'Bar'.

Điều này được đính kèm đúng được khai báo đúng cách và khai báo không gian tên trong XAML tham chiếu chính xác vùng tên được yêu cầu. Thuộc tính XAML đính kèm hoạt động tốt nếu được nạp vào các từ điển được hợp nhất khai báo thông qua đánh dấu App.xaml.

Dưới đây là một bản sao viết tắt của XAML mà tôi đang cố gắng để nạp trong thời gian chạy:

<ResourceDictionary xmlns:u="clr-namespace:Company.Product.Utils" 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Style x:Key="ControlPanelStyle" TargetType="ContentControl"> 
    <Setter Property="Template"> 
     <Setter.Value> 
     <ControlTemplate TargetType="ContentControl"> 
      <Grid Margin="0" u:Bar.Foo="True"> 
      <!-- Stuff and things --> 
      <ContentPresenter Content="{TemplateBinding Content}" /> 
      </Grid> 
     </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    </Style> 
</ResourceDictionary> 

Tại sao tham chiếu đến các tài sản gắn liền không hoạt động khi nạp XAML trong thời gian chạy khi nó được chỉ làm việc tốt khi "tĩnh" được tải?

Trả lời

15

Tôi chỉ tìm ra nguồn gốc của sự cố. Trong XAML của chúng tôi, chúng tôi đã tuyên bố không gian tên của chúng tôi như sau:

xmlns:u="clr-namespace:Company.Product.Utils" 

Có vẻ như rằng mặc dù công trình này cho XAML tĩnh-biên dịch, nó không làm việc cho XAML nạp tự động bởi vì khi động nạp, lắp ráp cho các không gian tên không được giải quyết. Khi chúng tôi đã thay đổi khai báo không gian tên này, nó đã hoạt động:

xmlns:u="clr-namespace:Company.Product.Utils;assembly=OurAssembly" 
0

Tôi vừa đối mặt với vấn đề này ngày hôm nay và tôi đã giải quyết nó bằng cách sử dụng một hành vi ... đó là loại xấu xí nhưng nó là lừa.

public string Title 
    { 
     get { return (string)GetValue(TitleProperty); } 
     set { SetValue(TitleProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for MyProperty. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty TitleProperty = 
     DependencyProperty.Register("Title", typeof(string), typeof(AddressableObjectBehavior), new PropertyMetadata(null, OnTitleChanged)); 

    protected override void OnAttached() 
    { 
     AddressableObject.SetTitle(this.AssociatedObject, this.Title); 
     base.OnAttached(); 
    } 

Hy vọng điều đó sẽ hữu ích! Chúc mừng! Fer Callejón.-


Hi-cốp, đó là lạ, tôi có lắp ráp các tham chiếu như bạn nói

xmlns:bsic="clr-namespace:Bsi.Ipp.Eurocodes.UI.Controls;assembly=Bsi.Ipp.Eurocodes.UI.Controls" 

Nhưng, dù sao, nó không hoạt động. Sự khác biệt là tôi đang tải Canvas không phải là Tài nguyên, nhưng tôi đoán, xác thực xaml phải giống nhau.

Tôi sẽ thử bằng cách đặt ns này trên cùng một thẻ nơi tôi sẽ sử dụng nó.

Chúc mừng !!

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