2012-10-16 105 views

回答

5

快速回答:

  • 您的Android圖像文件存儲在assets/images/i1.png
  • 並確保它被標記爲AndroidAsset
  • 那麼你的路徑需要images/i1.png

較長的答案:

理想的情況下你的視圖模型應該是平臺獨立的,不知道查看關注。

所以你的視圖模型可能也許暴露象一個屬性:

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

,其中游戲狀態是一個枚舉,如:

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

你可能會再有較喜歡在資產結構,這些狀態的圖像:

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

其中每個文件都標有BuildAction AndroidAsset。

要然後在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(); 
} 

其在設置配置。 CS使用:

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

有了這個,那麼你的axml綁定語句將是:

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

另一種可選擇的方法使用資源而不是資產,看MvxButtonIconBindingІssue with binding to GridLayout to Android

+0

酷!非常感謝你! –

+0

我想澄清。圖像應該總是包含在項目UI中?是? –

+0

是的 - 現在Android可以做一些「資源捆綁」,但是通常所有資源都必須進入UI項目。如果你想在Android,WP7等之間共享圖像文件,那麼你可以在Visual Studio中做'添加爲鏈接'。 – Stuart

0

我無法修復的問題。 My 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; 
    } 
} 

我的轉換。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'}}" 

/>

我的UI項目 :enter image description here

+0

我檢查了正確的圖像綁定路徑。可能是相同路徑的問題。 –

+0

你真的不應該寫回答作爲問題 - 人們看不到它們...... – Stuart

+0

有人猜測,這只是一個路徑問題 - 記住Android是Linux - CaseSensitive也是如此 - 所以'Square'不是'square' 。最好的辦法是先嚐試綁定assets/i1.png中的文件,然後再構建更復雜的模式...... – Stuart

0

當圖像被放置在文件夾中的資產,並表示簡單地表示圖片的名字 - 它的工作原理。 當它創建另一個文件夾並指定路徑:

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

不行!

0
<Mvx.MvxImageView 
    android:layout_width="40dp" 
    android:layout_height="40dp" 
    local:MvxBind="AssetImagePath PathImage,Converter=GameImage" /> 

應該也行