2011-01-07 74 views
1

我必須把動態生成的圖像分配動態生成圖像ToggleButton.Content

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

要切換按鈕的背景。當我將生成的圖像分配給ToggleButton.Content屬性時,我會看到「System.Drawing.Bitmap」字符串,而不是圖像本身。它看起來像ToString()方法用於Content屬性。我如何顯示生成的圖像呢?

+0

我認爲你需要覆蓋默認控件模板用自己的一個做到這一點...或者,如果發現所創建的映像Togglebutton有一個DataTemplate字段,用它來代替:p – Machinarius 2011-01-07 23:13:42

回答

2

如果WPF不具有相應的轉換器,它只是調用ToString()方法,位圖格式是不合適的,通常要使用什麼是Image與作爲BitmapImage,有幾種方法可以做到之間的轉換源不同的格式。
下面是一個方法,確實從BitmapBitmapImage的轉化:

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比未壓縮格式速度較慢,但​​它保留了透明性,如果有的話。
現在,您應該可以將其用作圖像控件的來源,並將此圖像控件用作按鈕的內容。

2

「內容」屬性與您在ToggleButton表面上編寫的內容有關。您需要初始化UI元素的「背景」屬性。這裏有一個例子:

 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