7

मैं यह पता लगाने की कोशिश कर रहा हूं कि हमारे सिल्वरलाइट 4 एप्लिकेशन में रनटाइम पर प्रोग्रामेटिक रूप से थीम कैसे लागू करें। मुझे लगा कि यह एक्सएएमएल से संसाधन शब्दकोश लोड करने और एप्लिकेशन के मर्ज किए गए शब्दकोशों के साथ विलय करने जितना सरल होना चाहिए।XamlReader.Load क्यों 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); 
    } 
} 

दुर्भाग्य से, एक XamlParseExceptionXamlReader.Load को कॉल के दौरान उठाया है:

कुर्की संपत्ति 'फू' प्रकार 'बार' में नहीं मिला था यहाँ मेरी कोड अब तक है।

यह ठीक से जुड़ी ठीक से घोषित है, और XAML में नाम स्थान घोषणा सही ढंग से संदर्भित करती आवश्यक नाम स्थान। अटैचमेंट एक्सएएमएल ऐप.एक्सएमएल मार्कअप के माध्यम से विलय किए गए शब्दकोशों में लोड होने पर ठीक काम करता है।

<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> 

क्यों है संलग्न संपत्ति के संदर्भ में जब रनटाइम पर XAML लोड हो रहा है जब यह ठीक काम कर रहा है जब काम नहीं कर रहा:

यहाँ XAML जो मैं रनटाइम पर लोड करने के लिए कोशिश कर रहा हूँ की एक संक्षिप्त प्रतिलिपि है "स्थिर रूप से" लोड किया गया?

उत्तर

15

मैंने अभी समस्या का स्रोत निकाला है। हमारे XAML में, हम अपने नाम स्थान इस प्रकार की घोषणा की थी:

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

ऐसा लगता है कि हालांकि यह स्थिर संकलित XAML के लिए काम करता है, यह नाम स्थान के लिए गतिशील रूप से भरी हुई XAML के लिए काम नहीं करता है, क्योंकि जब गतिशील लोड, विधानसभा हल नहीं होता है। एक बार जब हमने नामस्थान घोषणा को बदल दिया, तो यह काम किया:

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

मुझे आज इस समस्या का सामना करना पड़ा और मैंने इसे व्यवहार का उपयोग करके हल किया ... यह बदसूरत है लेकिन यह चाल है।

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(); 
    } 

आशा है कि यह मदद करे! चीयर्स! फेर Callejón.-


हाय याकूब, कि अजीब है के रूप में आप

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

कहा कि मैं विधानसभा संदर्भित है, लेकिन, वैसे भी, यह काम नहीं करता। अंतर यह है कि मैं एक कैनवास को संसाधन नहीं लोड कर रहा हूं, लेकिन मुझे लगता है, xaml सत्यापन एक जैसा होना चाहिए।

मैं इस एनएस को उसी टैग पर सेट करके कोशिश करूंगा जहां मैं इसका उपयोग करने जा रहा हूं।

चीयर्स !!

संबंधित मुद्दे