2011-07-15 134 views
0

好的,我正在創建的圖像列表(使用列表框),左側是縮略圖,右側是圖像標題。我的XAML設置是這樣的:將XAML DataTemplate中的圖像源綁定到Silverlight 4中的URI

<ListBox HorizontalAlignment="Left" Margin="6,6,0,6" Name="CurrentPhotos" Width="184" SelectionChanged="CurrentPhotos_SelectionChanged"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Horizontal"> 
       <Image Source="{Binding Converter={StaticResource FilePathConverter}}" /> 
       <sdk:Label Content="{Binding Title}"></sdk:Label> 
      </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

我得在App.xaml中定義的FilePathConverter鍵和代碼設置:

public class FilePathConverter : IValueConverter 
{ 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (targetType == typeof(string)) 
     { 
      return (value as PhotoSummary).FullThumbPath(); 
     } 
     else 
     { 
      return (value as PhotoSummary).Thumb(); 
     } 

    } 

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

有兩個斷點轉換和ConvertBack方法。 ConvertBack永遠不會被觸發(所以沒有例外等),並且在Convert方法中,Thumb正確地返回(字符串輸入是由於某些測試原因而留下的,並且目前還沒有使用,它不會被觸發),並且Thumb擴展方法是this :

public static object Thumb(this PhotoSummary ps) 
{ 
    Uri uri = new Uri("http://" + Settings.Host + "/Content/Thumbs/" + ps.Uploaded.Year + "/" + ps.Uploaded.Month + "/" + ps.ID + ".jpg", UriKind.Absolute); 
    return new BitmapImage(uri); 
} 

這個被調用,並且Uri被正確構建(測試了幾次)。但是,當我運行該應用程序時,該列表僅包含照片的標題,並且沒有圖像。所有圖像都很小(它們只是大拇指),本地文件,所以它們需要立即加載,因此它也不是加載問題。但它好像沒有圖像標籤那裏。它只顯示照片的標籤。轉換器正在工作,Uri是正確的,根本沒有錯誤,但沒有圖像顯示。

有什麼建議嗎?

+0

您是否嘗試過使用小提琴手,以驗證是否Silverlight是實拍的圖像,如果真的返回的圖像的請求顯示? – MerickOWA

+0

試過了,沒有,沒有請求。我可以看到來自同一應用程序的其他請求(服務調用),它們工作,我可以在提琴手中看到它們,但沒有圖像請求。很奇怪。 –

+0

Hrm奇怪,也許嘗試訂閱圖像上的ImageFailed事件,看看解析Uri時是否有一些問題阻止下載開始。 – MerickOWA

回答

1

好的,問題是關於SL中的安全限制。它在本地運行,並撥打電話http://localhost ...由於安全限制(至少對於圖像)失敗。我讀過如果我製作了一個測試頁面,從本地服務器啓動等,然後運行它,錯誤將消失,但是我沒有采取這種解決方法,而是檢查了需要提升的信任,並且它突然開始工作。所以問題就解決了。

+0

也許那麼另一個解決方案是使用相對URL如果可能,而不是絕對的? – MerickOWA

+0

好吧,我不認爲這會產生差異。最後,要調用的URL是相同的URL。我也有clientaccesspolicy.xml,但那不起作用,所以還有其他的東西。由於其他一些原因,絕對的uri是非常適合我的項目而不是相對的。 –

1

您可能必須在轉換器中明確加載圖像。 MSDN page for BitmapImage顯示以下代碼片段:

// Create the image element. 
Image simpleImage = new Image();  
simpleImage.Width = 200; 
simpleImage.Margin = new Thickness(5); 

// Create source. 
BitmapImage bi = new BitmapImage(); 
// BitmapImage.UriSource must be in a BeginInit/EndInit block. 
bi.BeginInit(); 
bi.UriSource = new Uri(@"/sampleImages/cherries_larger.jpg",UriKind.RelativeOrAbsolute); 
bi.EndInit(); 
// Set the image source. 


simpleImage.Source = bi; 
+0

這可能會起作用(儘管此代碼示例是針對WPF而不是SL,因爲SL中沒有Begin/End init),但我試圖在純XAML中實現它(至少在XAML中是「聲明式方式」可能) –

0

進出口使用本作完全一樣的問題,但使用Silverlight 5 IM向eleated信任,不知道它的事項

<DataTemplate x:Key="DataTemplate1"> 
     <Grid> 
      <Image Margin="0" Width="25" Height="25" Source="{Binding EventType, StringFormat=/Icons/EventType\{0:d\}.png}"/> 
     </Grid> 
    </DataTemplate> 

而且效果很好。其DataGrid的數據模板,其中此EventType是枚舉類型。

這是小提琴手後來

http://www.localdomain.loc/ClientBin/Icons/EventType1.png 
相關問題