源只能从xaml设置

时间:2018-06-01 23:02:17

标签: xamarin.forms

我以编程方式设置ResourceDictionary的source属性,而不是在Xamarin表单项目中设置xaml。

在运行期间,我总是得到System.invalidOperation异常,并带有消息" Source只能从Xaml设置。

Resources = Resources ?? new ResourceDictionary();
    if(Resources.Source == null)
                {
                    Resources.Source = new Uri("/Styles/ActiveTrackerStyle.xaml", UriKind.Relative);
                }

在设置Source时,想知道我是否做错了什么。 Source属性同时包含getter和setter。这里有什么错误的指示。

1 个答案:

答案 0 :(得分:0)

在同事的帮助下,我开始工作了:

首先:浏览Xamarin.Forms的ResourceDictionary类(here),我看到了以下属性:

public Uri Source {
            get { return _source; }
            set {
                if (_source == value)
                    return;
                throw new InvalidOperationException("Source can only be set from XAML."); //through the RDSourceTypeConverter
}

如果已经设置了私有变量“ _source”,则似乎无法更改源代码。

但是,该类还具有另一个方法“ SetAndLoadSource”,并且在此方法中设置_source变量时没有进行任何检查。因此,我通过执行以下操作使其工作:

var source = new Uri("/Styles/LightResourceDictionary.xaml", UriKind.RelativeOrAbsolute);
var resourceDictionary = new ResourceDictionary();
resourceDictionary.SetAndLoadSource(source, "Styles/LightResourceDictionary.xaml", this.GetType().GetTypeInfo().Assembly, null);
ThemeDictionary.MergedDictionaries.Add(resourceDictionary);
ThemeDictionary.MergedDictionaries.ElementAt(0).Source = source;

请注意,“ ThemeDictionary”是我的MergedDictionary的x:Name:

<ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary x:Name="ThemeDictionary">
                <ResourceDictionary.MergedDictionaries>
                    <ResourceDictionary Source="Styles/DarkResourceDictionary.xaml"/>
                </ResourceDictionary.MergedDictionaries>
            </ResourceDictionary>
        </ResourceDictionary.MergedDictionaries>
      </ResourceDictionary>