2014-11-13 5 views
1

내 응용 프로그램에 긴 목록 선택기가 있습니다. 목록 아래에 아이콘과 캡션이 표시되어야합니다. 아이콘은 비트 맵을 생성하는 데 사용될 수있는 바이트 어레이와 같은 서버에서 다운로드되면, 아이콘은 서버로부터 다운로드하여 표시한다이미지가있는 Windows Phone 8.1 LongListSelector

enter image description here

아래 이미지에서 보듯이 그리드로 표시 . 비트 맵을 LongListSelectors 템플릿의 이미지에 바인딩하는 방법 내 데이터 템플릿은 다음과 같습니다.

<phone:LongListSelector.ItemTemplate> 
        <DataTemplate> 
         <Grid Margin="5,5,5,5" Background="{StaticResource PhoneAccentBrush}"> 
          <Grid VerticalAlignment="Center" HorizontalAlignment="Center"> 
           <Image Height="70" Width="70" Margin="10,0,0,0" Source="/Assets/Images/appimg.png"> 
           </Image> 
          </Grid> 
          <StackPanel VerticalAlignment="Bottom" HorizontalAlignment="Center">   
          <TextBlock Margin="5,5,5,5" TextTrimming="WordEllipsis" TextWrapping="NoWrap" Text="{Binding appTitle}"></TextBlock> 
          </StackPanel> 
         </Grid> 
        </DataTemplate> 
</phone:LongListSelector.ItemTemplate> 

현재 템플릿 경로에는 아이콘 경로가 하드 코드되어 있습니다. 비트 맵을 이미지에 바인딩하는 방법에 대한 정보를 입력하십시오.

답변

2

전화 프로젝트의 어셈블리 이름입니다 가정 할 Conveter

을 사용 PhoneApp1

다음 코드를 변환 만들기 :

using System; 

namespace PhoneApp1.Converters 
{ 
    using System.Globalization; 
    using System.IO; 
    using System.Windows.Data; 
    using System.Windows.Media.Imaging; 

public class ByteToImageConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var data = value as byte[]; 

     if (data != null) 
     { 
      using(var stream = new MemoryStream(data)) 
      { 
       var bitmapImage = new BitmapImage(); 
       bitmapImage.SetSource(stream); 
       return bitmapImage; 
      } 
     } 
     return null; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
    } 
} 

당신의 XAML에서 다음 네임 스페이스 선언을 사용합니다 :

xmlns:converters="clr-namespace:PhoneApp1.Converters" 
xaml :뒤에 0
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> 
     <Grid.Resources> 
      <converters:ByteToImageConverter x:Key="ByteToImageConverter" /> 
     </Grid.Resources> 
     <phone:LongListSelector x:Name="lstTiles"> 
      <phone:LongListSelector.ItemTemplate> 
       <DataTemplate> 
        <Grid Margin="5,5,5,5" Background="{StaticResource PhoneAccentBrush}"> 
         <Grid VerticalAlignment="Center" HorizontalAlignment="Center"> 
          <Image Height="70" Width="70" Margin="10,0,0,0" Source="{Binding Image, Converter={StaticResource ByteToImageConverter}}"> 
          </Image> 
         </Grid> 
         <StackPanel VerticalAlignment="Bottom" HorizontalAlignment="Center"> 
          <TextBlock Margin="5,5,5,5" TextTrimming="WordEllipsis" TextWrapping="NoWrap" Text="{Binding Title}"></TextBlock> 
         </StackPanel> 
        </Grid> 
       </DataTemplate> 
      </phone:LongListSelector.ItemTemplate> 
     </phone:LongListSelector> 
    </Grid> 

코드와 모델

public partial class MainPage : PhoneApplicationPage 
{ 
    // Constructor 
    public MainPage() 
    { 
     InitializeComponent(); 

     this.BindTiles(); 
    } 


    private void BindTiles() 
    { 
     var sampleRandomImageBytes = Convert.FromBase64String(@"iVBORw0KGgoAAAANSUhEUgAAAGgAAABbCAYAAACf8sCiAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADeSURBVHhe7dExAQAwDMCgmVj9O21tcORAAe/PbFwF4QrCFYQrCFcQriBcQbiCcAXhCsIVhCsIVxCuIFxBuIJwBeEKwhWEKwhXEK4gXEG4gnAF4QrCFYQrCFcQriBcQbiCcAXhCsIVhCsIVxCuIFxBuIJwBeEKwhWEKwhXEK4gXEG4gnAF4QrCFYQrCFcQriBcQbiCcAXhCsIVhCsIVxCuIFxBuIJwBeEKwhWEKwhXEK4gXEG4gnAF4QrCFYQrCFcQriBcQbiCcAXhCsIVhCsIVxCuIFxBuIJwBeEKos0e0/44s5MWYKUAAAAASUVORK5CYII="); 

     var data = new[] 
     { 
      new AppTitle { Title = "Tile 1", Image = sampleRandomImageBytes }, new AppTitle { Title = "Tile 2", Image = sampleRandomImageBytes }, 
      new AppTitle { Title = "Tile 3", Image = sampleRandomImageBytes }, new AppTitle { Title = "Tile 4", Image = sampleRandomImageBytes } 
     }; 

     lstTiles.ItemsSource = data; 
    } 
} 

public class AppTitle 
{ 
    public string Title { get; set; } 

    public byte[] Image { get; set; } 
} 
+0

감사합니다. 나는 이것을 내 프로젝트에 포함 시켰고 xaml 페이지 xmlns : local = "clr-namespace : XYZ.Framework"와 그리드 리소스 의 상단에 추가했습니다. 하지만 프로젝트를 실행할 때 다음 오류가 발생합니다. Message = 'XYZ.Framework.ByteToImageConverter'유형의 인스턴스를 만들 수 없습니다. 내가 여기서 뭔가를 놓치고 있니? –

+1

네임 스페이스 문제가 발생하면서 네임 스페이스를 포함하도록 질문이 업데이트되었습니다. 어셈블리 이름으로 PhoneApp1을 대체하고 어셈블리 이름이 무엇인지 알아 내고 솔루션 탐색기에서 프로젝트로 이동 한 다음 마우스 오른쪽 단추를 클릭하여 속성과 어셈블리 이름을 응용 프로그램 탭에 표시해야합니다. C#에 대한 Resharper에 투자 할 가치가 있을지도 모르지만 시간이 오래 걸리는 네임 스페이스를 저장합니다. – FunksMaName

+0

내 나쁜 :-(ByteToImageConverter 클래스 공개되지 않았습니다. 따라서 오류. 빠른 도움을 주셔서 감사합니다. –