【问题标题】:Binding to Path ImageView in MvvmCross for MonoDroid/Android在 MvvmCross 中为 MonoDroid/Android 绑定到路径 ImageView
【发布时间】:2012-10-16 23:38:04
【问题描述】:

在我的情况下路径"MyZooSnap.Core;component/Resources/Images/i.jpg"。 如何为 Android ImageView 转换路径? 为了在以下绑定中使用它:

{'AssetImagePath':{'Path':'ImagePath'}}

More here

similar questions

谢谢

【问题讨论】:

    标签: c# mono xamarin.android mvvmcross


    【解决方案1】:

    快速回答:

    • 如果您的Android图像文件存储在assets/images/i1.png
    • 然后确保它被标记为AndroidAsset
    • 那么你的路径需要是images/i1.png

    更长的答案:

    理想情况下,您的 ViewModel 应该独立于平台,并且不了解 View 问题。

    因此,您的 ViewModel 可能会公开如下属性:

     private GameState _state;
     public GameState State 
     { 
         get { return _state; }
         set { _state = value; RaisePropertyChanged(() => State); }
     }
    

    其中 GameState 是一个枚举,例如:

     public enum GameState
     {
         Stopped,
         Running,
         Paused,
         GameOver
     }
    

    然后,您可能会在资产结构中拥有代表这些状态的图像,例如:

    /assets/gamestates/stopped.png
    /assets/gamestates/running.png
    /assets/gamestates/paused.png
    /assets/gamestates/gameover.png
    

    其中每个文件都标有 AndroidAsset 的 BuildAction。

    要在 UI 中显示正确的图像,您需要一个值转换器,例如:

    public class GameStateConverter
        : MvxBaseValueConverter
    {
        public override object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return string.Format("gamestates/{0}.png", ((GameState)value).ToString().ToLower());
        }
    }
    

    使用转换器包装器映射,例如:

    public class Converters
    {
        public readonly GameStateConverter GameState = new GameStateConverter();
    }
    

    在 setup.cs 中使用:

        protected override IEnumerable<Type> ValueConverterHolders
        {
            get { return new[] { typeof(Converters) }; }
        }
    

    有了这个,那么你的 axml 绑定语句将是:

        {'AssetImagePath':{'Path':'State', 'Converter':'GameState'}}
    

    有关使用资源而不是资产的替代方法,请参阅 MvxButtonIconBinding in Іssue with binding to GridLayout to Android

    【讨论】:

    • 我想澄清一下。图像应该始终包含在项目 UI 中吗?是吗?
    • 是的 - Android 现在可以进行一些“资源捆绑”,但通常所有资源都必须放在 UI 项目中。如果您想在 Android、WP7 等之间共享图像文件,那么您可以在 Visual Studio 中执行“添加为链接”。
    • 发布带有重要细节、代码和屏幕截图的问题。如果您发布的所有内容都是“我无法解决问题”,那么没有人可以帮助您
    • 是否可以使用最适合当前密度的资源而不是具有唯一大小的资产?
    【解决方案2】:

    我无法解决问题。 我的 MainViewModel.cs

    public class MainMenuViewModel
        : MvxViewModel
    {
        private const string path = "myimage";
    
        public List<SquareModel> Items { get; set; }
    
        public IMvxCommand ShowItemCommand
        {
            get
            {
                return new MvxRelayCommand<Type>((type) => this.RequestNavigate(typeof(MainMenuViewModel)));
            }
        }
    
        public MainMenuViewModel()
        {
            Items = GetCollection();
        }
    
        public List<SquareModel> GetCollection()
        {
            List<SquareModel> col = new List<SquareModel>();
            for (int i = 0; i < 20; i++)
            {
                col.Add(new SquareModel { ID = i, PathImage = path });
            }
            return col;
        }
    }
    

    我的 Converts.cs

    public class Converters
    {
        public readonly PathImageConverter GameImage = new PathImageConverter();
    }
    

    我的 PathImageConverter.cs

    public class PathImageConverter
        : MvxBaseValueConverter
    {
        public override object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return string.Format("squareresources/{0}.png", value.ToString().ToLower());
        }
    }
    

    我的 Setup.cs

    public class Setup
        : MvxBaseAndroidBindingSetup
    {
        public Setup(Context applicationContext)
            : base(applicationContext)
        {
        }
    
        protected override MvxApplication CreateApp()
        {
            return new App();
        }
    
        protected override IEnumerable<Type> ValueConverterHolders
        {
            get { return new[] { typeof(Converters.Converters) }; }
        }
    }
    

    我的 GameView.axml

    <cirrious.mvvmcross.binding.android.views.MvxBindableGridView
                      xmlns:android="http://schemas.android.com/apk/res/android"
                      xmlns:local="http://schemas.android.com/apk/res/MyZooSnap.UI"
                      android:layout_width="fill_parent"
                      android:layout_height="fill_parent"
                      android:numColumns="4"
                      android:verticalSpacing="10dp"
                      android:horizontalSpacing="10dp"
                      android:gravity="center"
                      local:MvxItemTemplate="@layout/itemimage"
                      local:MvxBind="{'ItemsSource':{'Path':'Items'}}" />
    

    我的 ItemImage.axml

    <ImageView
      xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:local="http://schemas.android.com/apk/res/MyZooSnap.UI"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"
      android:padding="10dp"
      local:MvxBind="{'AssetImagePath':{'Path':'PathImage', 'Converter':'GameImage'}}"
    

    />

    我的用户界面项目 :

    【讨论】:

    • 我正确检查了图像绑定的路径。可能是同一路径的问题。
    • 猜测,这只是一个路径问题——记住 Android 是 Linux——CaseSensitive 也是如此——所以Square 不是square。最好的办法是从尝试绑定 assets/i1.png 中的文件开始,然后构建更复杂的模式...
    【解决方案3】:

    当图像被放置在文件夹资产和指示简单地表明图片的名称 - 它的作品。 当它创建另一个文件夹并指定路径时:

    /asset/folder/image.png
    asset/folder/image.png
    /folder/image.png
    folder/image.png
    

    不起作用!

    【讨论】:

      【解决方案4】:
      <Mvx.MvxImageView
          android:layout_width="40dp"
          android:layout_height="40dp"
          local:MvxBind="AssetImagePath PathImage,Converter=GameImage" />
      

      应该也可以

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-25
        • 2014-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多