Назначьте динамически сгенерированное изображение для ToggleButton.Content - PullRequest
1 голос
/ 08 января 2011

Я должен поставить динамически сгенерированное изображение

var img = new Bitmap(..);
// draw something on img canvas ...

На фоне ToggleButton. Когда я назначаю сгенерированное изображение свойству ToggleButton.Content, я вижу строку «System.Drawing.Bitmap», а не само изображение. Похоже, что метод ToString () используется для свойства Content. Как я могу показать сгенерированное изображение вместо этого?

Ответы [ 2 ]

2 голосов
/ 08 января 2011

Свойство «Содержимое» относится к тому, что вы пишете на поверхности ToggleButton. Вам нужно инициализировать свойство «Background» элемента пользовательского интерфейса. Вот один пример:

        PixelFormat pf = PixelFormats.Bgr32;
        int width = 200;
        int height = 200;
        int rawStride = (width * pf.BitsPerPixel + 7) / 8;
        byte[] rawImage = new byte[rawStride * height];

        // Initialize the image with data.
        Random value = new Random();
        value.NextBytes(rawImage);

        // Create a BitmapSource.
        BitmapSource bitmap = BitmapSource.Create(width, height, 96, 96, pf, null, rawImage, rawStride);

        ImageBrush imgBrush = new ImageBrush(bitmap);
        myToggleButton.Background = imgBrush;

Я создал изображение, используя следующую статью http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.bitmapsource(VS.85).aspx

2 голосов
/ 08 января 2011

Если в WPF нет подходящего конвертера, он просто вызывает метод ToString(), формат растрового изображения не подходит, обычно вы хотите использовать Image с источником BitmapImage, существует способы конвертации между различными форматами.
Вот один метод, который делает преобразование из Bitmap в BitmapImage:

public static BitmapImage BitmapToBitmapImage(System.Drawing.Bitmap bitmap)
{
    MemoryStream ms = new MemoryStream();
    bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
    BitmapImage bImg = new System.Windows.Media.Imaging.BitmapImage();

    bImg.BeginInit();
    bImg.StreamSource = new MemoryStream(ms.ToArray());
    bImg.CreateOptions = BitmapCreateOptions.None;
    bImg.CacheOption = BitmapCacheOption.Default;
    bImg.EndInit();

    ms.Close();

    return bImg;
}

Обратите внимание, что ImageFormat.Png медленнее, чем несжатые форматы, но сохраняет прозрачность, если таковые имеются.
Теперь вы сможете использовать его в качестве источника элемента управления изображением, а этот элемент управления изображением - в качестве содержимого кнопки.

...