2013-03-12 7 views
0

У меня есть элемент управления сеткой, который я строю динамически.WPF Добавление управления изображениями динамически к динамически построенной сетке

Я пытаюсь добавить к нему некоторые другие элементы управления, мой TextBlock отображается нормально, но изображение не работает.

Да, источник изображения является действительным 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 этого источника управления изображением в показывает изображение правильно .. . только не здесь

+0

изображение, сохраненного в виде массива байтов в базе данных SQL – Kevin

+0

на вершине, что WPF не поддерживает используя прямое изображение или растровое изображение для использования в источнике управления изображениями, следовательно, необходимо затем преобразовать в поддерживаемый BitmapImage – Kevin

+0

WPF предоставляет все виды прямых преобразований из массива байтов в ImageSource. Фактически вы уже используете его, установив StreamSource BitmapImage. Что именно содержится в вашем массиве байтов? Является ли это сырым пиксельным буфером или кодированным изображением, например JPEG или PNG? – Clemens

ответ

1

Кажется, что установка

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

сделает изображение видимым.


Просто, чтобы показать код, как вы бы создать BitmapImage из массива байт, который содержит закодированный буфер изображения, например, JPEG или PNG. Извините, что это 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 knowlegde вообще я бы перевести, что следующим образом:

Dim stream As New MemoryStream(buffer) 
Dim bitmapImage As New BitmapImage() 
bitmapImage.BeginInit() 
bitmapImage.CacheOption = BitmapCacheOption.OnLoad 
bitmapImage.StreamSource = stream 
bitmapImage.EndInit() 
stream.Close() 
+0

спасибо за это Клеменс, я уверен, что это поможет очистить мой код;) Я вернусь после того, как я проведу проверку, если он исправит проблему в вопросе, хотя ... (нет проблем, я могу конвертировать;)) – Kevin

+0

ok, я обновил вопрос с помощью нового кода и проверил, что с обычным управлением изображениями в XAML я могу установить источник из db ... однако это не отвечает на вопрос – Kevin

Смежные вопросы