我以编程方式设置 ResourceDictionary 的源属性,而不是从 Xamarin 表单项目中的 xaml 中设置。
在运行时,我总是收到 System.invalidOperation 异常,并显示消息“Source can only be set from Xaml.
Resources = Resources ?? new ResourceDictionary();
if(Resources.Source == null)
{
Resources.Source = new Uri("/Styles/ActiveTrackerStyle.xaml", UriKind.Relative);
}
Run Code Online (Sandbox Code Playgroud)
想知道我在设置源时是否做错了什么。Source 属性同时具有 getter 和 setter。这里有什么问题的任何指示。
小智 1
在同事的帮助下,我成功了:
首先:浏览 Xamarin.Forms 的 ResourceDictionary 类(在这里,我看到了以下属性:
public Uri Source {
get { return _source; }
set {
if (_source == value)
return;
throw new InvalidOperationException("Source can only be set from XAML."); //through the RDSourceTypeConverter
}
Run Code Online (Sandbox Code Playgroud)
如果已经设置了私有变量“_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;
Run Code Online (Sandbox Code Playgroud)
请注意,“ThemeDictionary”是我的 MergedDictionary 的 x:Name:
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary x:Name="ThemeDictionary">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Styles/DarkResourceDictionary.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
977 次 |
| 最近记录: |