Xamarin Forms 5+Prism 8添加NavigationPage样式报资源键重复如何解决
报错原因
这个异常是Prism 8的默认机制和Xamarin Forms隐式样式的规则共同导致的:
- Xamarin Forms中未指定
x:Key的隐式样式,会自动将目标类型的FullName(也就是这里的Xamarin.Forms.NavigationPage)作为资源的Key存入ResourceDictionary - Prism 8在应用初始化时,会自动向全局ResourceDictionary中注入一个默认的NavigationPage隐式样式,你手动追加同TargetType的隐式样式时,就会出现Key重复的冲突,哪怕你没手动写重复的样式标签。
解决方案
你可以根据需求选择以下任意一种方案:
方案1:给自定义样式指定显式Key
给你的NavigationPage样式加唯一的x:Key属性,后续需要用到该样式的地方手动引用即可:
<Style x:Key="MyNavigationPageStyle" TargetType="{x:Type NavigationPage}"> <Setter Property="BackgroundColor" Value="{StaticResource PrimaryBackground}" /> <Setter Property="BarBackgroundColor" Value="#ea5c2d" /> </Style>
使用时在创建NavigationPage的地方指定样式即可:new NavigationPage(new MainPage()) { Style = (Style)Application.Current.Resources["MyNavigationPageStyle"] }
方案2:直接修改Prism注入的默认样式
不需要新增样式,直接在App.xaml.cs的InitializeComponent()执行完成后,修改已存在的NavigationPage样式属性:
public App() { InitializeComponent(); // 读取Prism自动注入的NavigationPage样式 var navigationStyle = (Style)Resources[typeof(NavigationPage)]; // 追加或修改属性赋值 navigationStyle.Setters.Add(new Setter { Property = NavigationPage.BackgroundColorProperty, Value = Resources["PrimaryBackground"] }); navigationStyle.Setters.Add(new Setter { Property = NavigationPage.BarBackgroundColorProperty, Value = Color.FromHex("#ea5c2d") }); }
方案3:关闭Prism自动注入样式的逻辑
在Prism的初始化配置中添加禁用自动样式的配置,之后你自定义的隐式样式就可以正常生效:
// 在Prism启动配置中添加DisableAutomaticNavigationPageStyle public App() : base((containerBuilder) => { }, new PlatformInitializer()) { // Xamarin Forms场景下的Prism配置写法 PrismAppBuilder.Create(builder => builder .DisableAutomaticNavigationPageStyle() // 加这行即可 .RegisterTypes(container => { /* 你的服务注册逻辑 */ }) .CreateWindow("NavigationPage/MainPage")); }
内容的提问来源于stack exchange,提问作者ledragon
相关产品推荐
相关产品推荐

