7

我想弄清楚如何以編程方式在我們的Silverlight 4應用程序運行時應用主題。我認爲這應該與從XAML加載資源字典並將其與應用程序的合併字典合併一樣簡單。這裏是我到目前爲止的代碼:爲什麼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); 
    } 
} 

不幸的是,XamlParseException呼叫期間提高到XamlReader.Load

的附着性能「富」並沒有在類型「欄」中。

這正確連接正確聲明,並在XAML命名空間聲明正確引用所需的命名空間。如果通過App.xaml標記聲明式加載到合併的字典中,附加的屬性XAML工作得很好。

下面是其中我想在運行時加載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時,當它工作得很好時,爲什麼不工作的參考附加屬性「靜態」加載?

回答

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" 

但是,不管怎樣,這是行不通的。不同之處在於我加載了Canvas而不是資源,但我想,xaml驗證應該是相同的。

我會試着將ns設置在我要使用它的相同標籤上。

乾杯!

相關問題