【发布时间】:2012-10-16 23:38:04
【问题描述】:
在我的情况下路径"MyZooSnap.Core;component/Resources/Images/i.jpg"。
如何为 Android ImageView 转换路径?
为了在以下绑定中使用它:
{'AssetImagePath':{'Path':'ImagePath'}}
谢谢
【问题讨论】:
标签: c# mono xamarin.android mvvmcross
在我的情况下路径"MyZooSnap.Core;component/Resources/Images/i.jpg"。
如何为 Android ImageView 转换路径?
为了在以下绑定中使用它:
{'AssetImagePath':{'Path':'ImagePath'}}
谢谢
【问题讨论】:
标签: c# mono xamarin.android mvvmcross
快速回答:
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
【讨论】:
我无法解决问题。 我的 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'}}"
/>
我的用户界面项目 :
【讨论】:
Square 不是square。最好的办法是从尝试绑定 assets/i1.png 中的文件开始,然后构建更复杂的模式...
当图像被放置在文件夹资产和指示简单地表明图片的名称 - 它的作品。 当它创建另一个文件夹并指定路径时:
/asset/folder/image.png
asset/folder/image.png
/folder/image.png
folder/image.png
不起作用!
【讨论】:
<Mvx.MvxImageView
android:layout_width="40dp"
android:layout_height="40dp"
local:MvxBind="AssetImagePath PathImage,Converter=GameImage" />
应该也可以
【讨论】: