在WPF/XAML中使用Winform中的控件

首先看看XAML代码:(注意下面加粗的部分)
<Window
x:Class="WindowsApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   
Title="WinForm控件与WPF控件的交互" Height="400" Width="600"
       
xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
   
>
  <StackPanel>
    <Grid>
     
<Grid.ColumnDefinitions>
        <ColumnDefinition/>
       
<ColumnDefinition/>
     
</Grid.ColumnDefinitions>
      <Image Source="Girl.jpg"
MaxHeight="300"  Grid.Column="0" Name="WPFImage"/>
     
<WindowsFormsHost Grid.Column="1" MaxHeight="300" Name="pictureHost"
>
        <wf:PictureBox />
     
</WindowsFormsHost>
    </Grid>
 
</StackPanel>
</Window>
C#代码:
       System.Windows.Forms.PictureBox
_pictureBox = null;
        void Window1_Loaded(object sender,
RoutedEventArgs e)
        {
            _pictureBox = pictureHost.Child
as System.Windows.Forms.PictureBox;
            _pictureBox.Image =
GetBitmap(WPFImage);
        }

        #region Image
Functions
        //
以下代码实现了两者WPF与GDI+的交互
public void ConvertToGrayscale(System.Drawing.Bitmap source , int sliderVal)
       
{
            System.Drawing.Bitmap bm = new
System.Drawing.Bitmap(source.Width,
source.Height);
            //下面代码还可以使用不安全代码,以提高效率
            for (int y
= 0; y < bm.Height; y++)
            {
                for (int x = 0;
x < bm.Width; x++)
                {
                   
System.Drawing.Color c = source.GetPixel(x, y);
                    int luma
= (int)(c.R * ((double)sliderVal / (double)10) * 0.3 + c.G * ((double)sliderVal
/ (double)10) * 0.59 + c.B * ((double)sliderVal / (double)10) *
0.11);
                    bm.SetPixel(x, y,
System.Drawing.Color.FromArgb(luma, luma, luma));
               
}
            }
            _pictureBox.Image = bm;
        }

        System.Drawing.Bitmap
AdjustBrightnessMatrix(System.Drawing.Bitmap img, int value)
       
{
            if (value == 0) // No change, so just return
               
return img;


            float sb = (float)value / 255F;
           
float[][] colorMatrixElements =
                           {

                                 new float[] {1,  0,  0,  0,
0},
                                 new float[] {0,  1,  0,  0,
0},
                                 new float[] {0,  0,  1,  0,
0},
                                 new float[] {0,  0,  0,  1,
0},
                                 new float[] {sb, sb, sb, 1,
1}
                           };


            System.Drawing.Imaging.ColorMatrix cm = new
System.Drawing.Imaging.ColorMatrix(colorMatrixElements);
           
System.Drawing.Imaging.ImageAttributes imgattr = new
System.Drawing.Imaging.ImageAttributes();
           
System.Drawing.Rectangle rc = new System.Drawing.Rectangle(0, 0, img.Width,
img.Height);
            System.Drawing.Graphics g =
System.Drawing.Graphics.FromImage(img);
            g.InterpolationMode =
System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
           
imgattr.SetColorMatrix(cm);
            g.DrawImage(img, rc, 0, 0, img.Width,
img.Height, System.Drawing.GraphicsUnit.Pixel, imgattr);


            imgattr.Dispose();
           
g.Dispose();
            return img;
        }
        #endregion Image Functions


        #region Image-Bitmap Interop Helpers
        private void
convertBitmapToBitmapSource(System.Drawing.Bitmap bitmap)
       
{
            using (bitmap)
            {
               
System.Windows.Media.Imaging.BitmapSource bitmapSource =
System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
                   
bitmap.GetHbitmap(),
                    IntPtr.Zero,
                   
Int32Rect.Empty,
                   
System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());


                WPFImage.Source =
bitmapSource;
            }
        }


        private System.Drawing.Bitmap GetBitmap(Image
image)
        {
            System.Windows.Forms.PictureBox picture =
_pictureBox;
                // Stream stm = File.Open("Waterfall.jpg",
FileMode.Open, FileAccess.Read))
                //// Since we're not
specifying a System.Windows.Media.Imaging.BitmapCacheOption, the pixel
format
                //// will be
System.Windows.Media.PixelFormats.Pbgra32.
                //
System.Windows.Media.Imaging.BitmapSource bitmapSource =
System.Windows.Media.Imaging.BitmapFrame.Create(
                //    stm,

                //    System.Windows.Media.Imaging.BitmapCreateOptions.None,

                //   
System.Windows.Media.Imaging.BitmapCacheOption.OnLoad);


                System.Windows.Media.Imaging.BitmapSource
bitmapSource = WPFImage.Source as BitmapSource;


                // Scale the image so that it will display
similarly to the WPF Image.
                double newWidthRatio =
picture.Width / (double)bitmapSource.PixelWidth;
                double
newHeightRatio = ((picture.Width * bitmapSource.PixelHeight) /
(double)bitmapSource.PixelWidth) / (double)bitmapSource.PixelHeight;


                System.Windows.Media.Imaging.BitmapSource
transformedBitmapSource = new
System.Windows.Media.Imaging.TransformedBitmap(
                   
bitmapSource,
                    new
System.Windows.Media.ScaleTransform(newWidthRatio, newHeightRatio));


                int width =
transformedBitmapSource.PixelWidth;
                int height =
transformedBitmapSource.PixelHeight;
                int stride = width *
((transformedBitmapSource.Format.BitsPerPixel + 7) / 8);


                byte[] bits = new byte[height *
stride];


                transformedBitmapSource.CopyPixels(bits,
stride, 0);


                unsafe
               
{
                    fixed (byte* pBits = bits)
                   
{
                        IntPtr ptr = new IntPtr(pBits);


                        System.Drawing.Bitmap bitmap = new
System.Drawing.Bitmap(
                           
width,
                            height,
                           
stride,
                           
System.Drawing.Imaging.PixelFormat.Format32bppPArgb,
                           
ptr);


                        return
bitmap;
                    }
                }
           
}
        #endregion Image-Bitmap Interop
Helpers

posted @ 2011-08-07 19:32  therockthe  阅读(510)  评论(0)    收藏  举报