0

動的に構築しているグリッドコントロールがあります。

他のコントロールを追加しようとしていますが、TextBlockは正常に表示されますが、Imageは表示されません。

はい、画像ソースは有効なBitmapImageです。CompanyDetailsは正しく入力されています。

コードは次のとおりです。

Private Sub CreateItemContent(ByVal _Item As CompanyTyping.List, ByVal _TV As RadTileView)
    Dim _Det = Company.CompanyDetails(_Item.CompanyID)
    Dim item As New RadTileViewItem()
    'create and define the inner grid
    Dim _PG As New Grid()
    Dim gridCol1 As New ColumnDefinition()
    gridCol1.Width = New GridLength(200)
    Dim gridCol2 As New ColumnDefinition()
    gridCol2.Width = New GridLength(0, GridUnitType.Star)
    _PG.ColumnDefinitions.Add(gridCol1)
    _PG.ColumnDefinitions.Add(gridCol2)
    'add the initial items to the initial grid
    Dim _Img As New Image()
    _Img.VerticalAlignment = Windows.VerticalAlignment.Top
    _Img.HorizontalAlignment = Windows.HorizontalAlignment.Stretch
    _Img.Visibility = Windows.Visibility.Visible
    _Img.MinHeight = 50
    _Img.MinWidth = 200
    _Img.Source = ByteArrayToImage(_Det(0).Logo)
    Grid.SetColumn(_Img, 1)
    _PG.Children.Add(_Img)
    Dim _PGI As New Grid()
    Dim gridRow1 As New RowDefinition()
    gridRow1.Height = New GridLength(29)
    Dim gridRow2 As New RowDefinition()
    gridRow2.Height = New GridLength(29)
    Dim gridRow3 As New RowDefinition()
    gridRow3.Height = New GridLength(29)
    Dim gridRow4 As New RowDefinition()
    gridRow4.Height = New GridLength(0, GridUnitType.Star)
    _PGI.RowDefinitions.Add(gridRow1)
    _PGI.RowDefinitions.Add(gridRow2)
    _PGI.RowDefinitions.Add(gridRow3)
    _PGI.RowDefinitions.Add(gridRow4)
    Grid.SetColumn(_PGI, 0)
    _PG.Children.Add(_PGI)
    Dim _TB1 As New TextBlock()
    _TB1.Text = _Item.MainContact
    Grid.SetRow(_TB1, 0)
    _PGI.Children.Add(_TB1)


    item.Header = _Item.Name & " - ID: " & _Item.CompanyID
    _TV.Items.Add(item)
    item.SetValue(RadTileViewItem.ContentProperty, _PG)
End Sub

そしてByteArrayToImage:

Public Function ByteArrayToImage(_Bytes As Byte()) As System.Windows.Media.Imaging.BitmapImage
    If _Bytes Is Nothing Then
        Return Nothing
    Else
        Dim _bm As New BitmapImage()
        Using _strm As New MemoryStream(_Bytes)
            With _bm
                .BeginInit()
                .CacheOption = BitmapCacheOption.OnLoad
                .StreamSource = _strm
                .EndInit()
            End With
        End Using
        Return _bm
    End If
End Function

これの完全なXAMLバージョンでは、画像コントロールのソースが画像を正しく表示していることを確認しました...ここにはありません

4

1 に答える 1

1

その設定のようです

gridCol2.Width = New GridLength(0, GridUnitType.Auto)

画像が期待どおりに表示されます。


エンコードされた画像バッファ(JPEGやPNGなど)を含むバイト配列からBitmapImageを作成する方法をコードで示すためだけに使用します。これはC#ですが、VBは話せません。ただし、VBに簡単に変換できるはずです。

byte[] buffer = ...
var bitmapImage = new BitmapImage();

using (var stream = new MemoryStream(buffer)) // create stream from buffer
{
    bitmapImage.BeginInit();
    bitmapImage.CacheOption = BitmapCacheOption.OnLoad; // necessary as stream is closed after EndInit
    bitmapImage.StreamSource = stream;
    bitmapImage.EndInit();
}
// stream is closed by leaving the using block

VBの知識がまったくない場合は、次のように翻訳します。

Dim stream As New MemoryStream(buffer)
Dim bitmapImage As New BitmapImage()
bitmapImage.BeginInit()
bitmapImage.CacheOption = BitmapCacheOption.OnLoad
bitmapImage.StreamSource = stream
bitmapImage.EndInit()
stream.Close()
于 2013-03-13T16:51:52.393 に答える