【问题标题】:Can I use xaml ApplicationResources with an MvvmCross Application我可以将 xaml ApplicationResources 与 MvvmCross 应用程序一起使用吗
【发布时间】:2015-09-29 09:36:14
【问题描述】:

我正在尝试将一些 ApplicationResources 添加到使用 MvvmCrossXamarin 应用程序中

我目前有一个像这样的App.cs 文件:

public class App : MvxApplication
{
    /// <summary>
    /// Initializes this instance.
    /// </summary>
    public override void Initialize()
    {
       this.CreatableTypes()
            .EndingWith("Service")
            .AsInterfaces()
            .RegisterAsLazySingleton();
        .....etc etc..
    }
}

我现在关注Working with Styles using Xaml for your application 并获得:

<?xml version="1.0" encoding="utf-8" ?>
<Application xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:mvvmcross="clr-namespace:Cirrious.MvvmCross.ViewModels;assembly=Cirrious.MvvmCross"
             x:Class="FieldStrikeMove.Core.App">
    <Application.Resources>
        <ResourceDictionary>
            <Style x:Key="TestStyle" TargetType="Label">
                <Setter Property="TextColor" Value="Green" />
            </Style>
        </ResourceDictionary>
    </Application.Resources>
</Application >

我还将partial 关键字添加到我的App.cs 类中,但这表示:

的部分声明不能指定不同的基类

所以我尝试了

<?xml version="1.0" encoding="utf-8" ?>
<mvvmcross:MvxApplication xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:mvvmcross="clr-namespace:Cirrious.MvvmCross.ViewModels;assembly=Cirrious.MvvmCross"
             x:Class="FieldStrikeMove.Core.App">
    <Application.Resources>
        <ResourceDictionary>
            <Style x:Key="TestStyle" TargetType="Label">
                <Setter Property="TextColor" Value="Green" />
            </Style>
        </ResourceDictionary>
    </Application.Resources>
</mvvmcross:MvxApplication>

但我明白了:

错误 35 类型“FieldStrikeMove.Core.App”不能用作泛型类型或方法“Xamarin.Forms.Xaml.Extensions.LoadFromXaml(TView, System.Type)”中的类型参数“TView”。没有从“FieldStrikeMove.Core.App”到“Xamarin.Forms.BindableObject”的隐式引用转换。

有没有办法让Xaml 应用程序资源与MvvmCross Xamarin 应用程序一起使用

【问题讨论】:

    标签: c# xaml xamarin mvvmcross xamarin.forms


    【解决方案1】:

    所以在@Davids 回答之后,我意识到提供一个新的App 类不会有任何结果。

    我发现我可以在代码中设置 ResourceDictionary 使用

    Application.Current.ResourceDictionary = new ResourceDictionary();
    //add styles here
    

    然后我尝试在 Xaml 中将其设置为 Xaml ResourceDictionary,如下所示:

    <ResourceDictionary xmlns="http://xamarin.com/schemas/2014/forms"
                 xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
                 x:Class="MyApp.Styles">
      <Style x:Key="labelStyle" TargetType="Label">
        <Setter Property="TextColor" Value="Green" />
      </Style>
    </ResourceDictionary>
    

    但我明白了

    MyApp.Styles 不能从密封类型派生 Xamarin.Forms.ResourceDictionary

    (感谢 Xamarin)

    因此我的最终解决方案是:

    ContentPage 添加到我的 PCL 项目中:

    <ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
                 xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
                 x:Class="MyApp.Styles">
      <ContentPage.Resources>
        <ResourceDictionary>
          <Style x:Key="labelStyle" TargetType="Label">
            <Setter Property="TextColor" Value="Green" />
          </Style>
        </ResourceDictionary>
      </ContentPage.Resources>
    </ContentPage>
    

    然后在MainActivityLoadApplication 调用之后做:

    var styles = new Styles();
    Xamarin.Forms.Application.Current.Resources = styles.Resources;
    

    【讨论】:

    • 最后两行添加了什么文件?我得到以下错误。缺少的任何想法:错误 CS0712 无法创建静态类“Device.Styles”的实例 CS1061“Device.Styles”不包含“资源”的定义,并且没有扩展方法“资源”接受类型的第一个参数“可以找到 Device.Styles'
    • @ManishJain 这表明Xamarin.Forms 添加了一个新的Device.Styles 类我建议完全限定它,这样你就可以拥有new MyApp.Styles()。最新的Xamarin.Forms 可以稍微改进这里的答案。这允许您创建自己的ResourceDictionaryMergeDictionaries
    【解决方案2】:

    可能不是您要寻找的答案,但我认为您不能。实际上,我认为您根本无法将 Xamarin.Forms 应用程序级别样式与 MVVMCross Xaml 或其他方式一起使用。这些样式似乎是从应用程序类中实现的。 Application 包含一个 ResourceDictionary,因此 Application 似乎负责应用 Dictionary 中定义的样式。

    MvxApplication 没有这样的属性,因此即使您将它们定义为 XAML 将它们加载到 ResourceDictionary 中,我也找不到可以应用它们的地方。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-14
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-20
      • 1970-01-01
      • 2019-10-31
      • 1970-01-01
      相关资源
      最近更新 更多