2011-01-03 3 views
1

Я новичок в WPF и пытаюсь использовать Controls.Image. У меня он растягивается, когда форма расширяется. Я пытаюсь создать Drawing.Bitmap во время выполнения, чтобы отобразить на Controls.Image в WPF. Когда я создаю Drawing.Bitmap, я хочу создать только такой масштаб, как элемент управления Image на экране (не тратьте циклы процессора). Для создания изображения у меня есть следующий код. Bitmap bImage = new Bitmap((int)imgInput.Width, (int)imgInput.Height); imgInput - это Controls.Image и bImage, очевидно, является Drawing.Bitmap. Однако imgInput.Width и Height отображаются как 0 во время выполнения, хотя они определенно не во время разработки. Если я не пытаюсь динамически растянуть изображение, чтобы развернуть его с окном, нет никаких проблем, которые он показывает, как ожидалось. Итак, как мне получить изображение. Также у кого-то есть лучший способ, чем создание Drawing.Bitmap в памяти и преобразование его в ImageSource для WPF? Я не загружаю изображение из URI или что-то в этом роде, я должен его создать в памяти.Получение элемента управления. Ширина и высота изображения

Я связывание изображения следующего кодом

  imgInput.Source = loadBitmap(bImage); 

    } 
    [DllImport("gdi32")] 
    static extern int DeleteObject(IntPtr o); 

    public static BitmapSource loadBitmap(System.Drawing.Bitmap source) 
    { 
     BitmapSource bs = null; 
     IntPtr ip = source.GetHbitmap(); 
     try 
     { 
      bs = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(ip, 
       IntPtr.Zero, Int32Rect.Empty, 
       System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions()); 
     } 
     finally 
     { 
      DeleteObject(ip); 
     } 

     return bs; 
    } 
+0

Как вы привязываете растровое изображение к изображению? У вас есть ширина/высота, явно установленная для вашего изображения в XAML? – BrokenGlass

+0

Ширина и высота изображения заданы как автоматические, но это необходимо для того, чтобы можно было установить горизонтальное и вертикальное выравнивание, чтобы поверить в – dko

+0

, что объяснило бы это: изображение будет изменяться по своему содержанию, t иметь любую ширину, пока вы не привяжете к нему растровое изображение. – BrokenGlass

ответ

2

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

Изображение XAML будет изменяться в зависимости от ширины и высоты самого растрового изображения и количества свободного места. WPF использует двухступенчатую макетную систему - в первом раунде каждому элементу управления задается, сколько места он хочет, во втором каждому элементу управления назначается ширина/высота.

Перед привязкой растрового изображения, и если ни один из предков вашего элемента управления изображением не имеет фиксированной/максимальной ширины, вы не можете получить высоту изображения, просто потому, что пока не установлено.

Одним из подходов было бы установить ширину/высоту изображения на основе предка с помощью привязки, что потребовало бы определенной ширины/высоты набора на контейнере.

Пример сетки контейнера:

<Image Source="sample.png" 
     Width="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type Grid}},Path=ActualWidth}" 
     Height="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type Grid}},Path=ActualHeight}" /> 

Также вы хотите, чтобы выбрать контейнер тщательно - это StackPanel т.е. всегда будет расти вместе с его детьми (по вертикали, если задана ориентация по горизонтали, и наоборот), если не указать фиксированная или максимальная ширина/высота. Другие контейнеры ведут себя по-другому, т. Е. UniformGrid будет равномерно распределять всех своих детей. Сначала я попробую Сетка только с одной строкой.

0

Чтобы получить Height и Width из Source вам нужно изменить ваш код для

Bitmap bImage = new Bitmap((int)imgInput.Source.Width, (int)imgInput.Source.Height); 

imgInput.Width и imgInput.Height дает высоту и Ширина элемента управления,

imgInput.Source.Width и imgInput.Source.Height дает высоту и ширину источника

+0

Хорошо, что произойдет, если исходный источник равен нулю? – dko

+0

Невозможно получить размер нулевого объекта. вам нужно подтвердить это. – Binil

+0

В сценарии вопроса источник еще не установлен, поэтому он всегда будет нулевым, этот подход не будет работать – BrokenGlass

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