您的位置:首页 > 其它

Silverlight的几个知识点(二)

2010-05-31 17:42 351 查看
1,Silverlight 与JS交互:

<1>, silverlight 调用js:

HtmlPage.Window.Invoke("函数名", new object[] { 参数数组});

HtmlPage.Window.CreateInstance("函数名", new object[] { 参数数组});

<2>,JS 调用silverlight方法:

HtmlPage.RegisterScriptableObject("RPFrame", this);// 1,注册
[ScriptableMember] // 2,标记
public DateTime GetDataFrom()
{
   return Utility.StartTime;
}
function pluginLoaded(sender, args) { // 3,JS调用
    slPlugin = sender.getHost();
    __dtFrom = slPlugin.content.RPFrame.GetDataFrom();
}


2,http://blog.csdn.net/kntao/archive/2010/04/15/5489635.aspx" target=_blank>silverlight hitTest

3, Control 控件Click 事件模拟

protected event RoutedEventHandler Click;
 void RotationPlanningSlot_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
 if (Click != null && e.GetPosition(thisElement.Parent as UIElement) == beginMousePosition) // Add click envent
            {
                Click(this, e);
            }
}


4,Silverlight 3的打印,

[ScriptableMember]
        public void GetPrintPNG()
        {
            WriteableBitmap bitmap = new WriteableBitmap(this.MainPlaningCanvas,new TranslateTransform());
            EditableImage imageData = new EditableImage(bitmap.PixelWidth, bitmap.PixelHeight);

            for (int y = 0; y < bitmap.PixelHeight; ++y)
            {
                for (int x = 0; x < bitmap.PixelWidth; ++x)
                {

                    int pixel = bitmap.Pixels[bitmap.PixelWidth * y + x];

                    imageData.SetPixel(x, y,
                                (byte)((pixel >> 16) & 0xFF),
                                (byte)((pixel >> 8) & 0xFF),
                                (byte)(pixel & 0xFF),
                                (byte)((pixel >> 24) & 0xFF)
                                );

                }
            }

            Stream pngStream = imageData.GetStream();

            byte[] binaryData = new Byte[pngStream.Length];
            long bytesRead = pngStream.Read(binaryData, 0, (int)pngStream.Length);

            string base64String =
                    System.Convert.ToBase64String(binaryData,
                                                  0,
                                                  binaryData.Length);

            // save the encoded PNG bytes to the page
            HtmlDocument document = HtmlPage.Document;
            HtmlElement txtPNGBytes = document.GetElementById("txtPNGBytes");
            txtPNGBytes.SetProperty("value", base64String);

            // this calls the js function "postBackPrint" which will cause a postback
            //HtmlPage.Window.CreateInstance("postBackPrint", new string[] { });
        }


PngEncoder.cs

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.IO;
using System.Windows.Browser;
using System.Reflection;

namespace PlanningCtrl.UI
{
  public class PngEncoder
  {
    private const int     _ADLER32_BASE = 65521;
    private const int     _MAXBLOCK = 0xFFFF;
    private static byte[] _HEADER = { 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A };
    private static byte[] _IHDR = { (byte)'I', (byte)'H', (byte)'D', (byte)'R' };
    private static byte[] _GAMA = { (byte)'g', (byte)'A', (byte)'M', (byte)'A' };
    private static byte[] _IDAT = { (byte)'I', (byte)'D', (byte)'A', (byte)'T' };
    private static byte[] _IEND = { (byte)'I', (byte)'E', (byte)'N', (byte)'D' };
    private static byte[] _4BYTEDATA = { 0, 0, 0, 0 };
    private static byte[] _ARGB = { 0, 0, 0, 0, 0, 0, 0, 0, 8, 6, 0, 0, 0 };

    public static Stream Encode(byte[] data, int width, int height)
    {
      MemoryStream  ms = new MemoryStream();
      byte[]        size;
      
      // Write PNG header
      ms.Write(_HEADER, 0, _HEADER.Length);
      
      // Write IHDR
      //  Width:              4 bytes
      //  Height:             4 bytes
      //  Bit depth:          1 byte
      //  Color type:         1 byte
      //  Compression method: 1 byte
      //  Filter method:      1 byte
      //  Interlace method:   1 byte

      size = BitConverter.GetBytes(width);
      _ARGB[0] = size[3]; _ARGB[1] = size[2]; _ARGB[2] = size[1]; _ARGB[3] = size[0];
      
      size = BitConverter.GetBytes(height);
      _ARGB[4] = size[3]; _ARGB[5] = size[2]; _ARGB[6] = size[1]; _ARGB[7] = size[0];
      
      // Write IHDR chunk
      WriteChunk(ms, _IHDR, _ARGB);
      
      // Set gamma = 1
      size = BitConverter.GetBytes(1 * 100000);
      _4BYTEDATA[0] = size[3]; _4BYTEDATA[1] = size[2]; _4BYTEDATA[2] = size[1]; _4BYTEDATA[3] = size[0];
      
      // Write gAMA chunk
      WriteChunk(ms, _GAMA, _4BYTEDATA);
      
      // Write IDAT chunk
      uint    widthLength = (uint)(width*4)+1;
      uint    dcSize = widthLength * (uint)height;      
      
      // First part of ZLIB header is 78 1101 1010 (DA) 0000 00001 (01)
      // ZLIB info
      //
      // CMF Byte: 78
      //  CINFO = 7 (32K window size)
      //  CM = 8 = (deflate compression)
      // FLG Byte: DA
      //  FLEVEL = 3 (bits 6 and 7 - ignored but signifies max compression)
      //  FDICT = 0 (bit 5, 0 - no preset dictionary)
      //  FCHCK = 26 (bits 0-4 - ensure CMF*256+FLG / 31 has no remainder)
      // Compressed data
      //  FLAGS: 0 or 1
      //    00000 00 (no compression) X (X=1 for last block, 0=not the last block)
      //    LEN = length in bytes (equal to ((width*4)+1)*height
      //    NLEN = one's compliment of LEN
      //    Example: 1111 1011 1111 1111 (FB), 0000 0100 0000 0000 (40)
      //    Data for each line: 0 [RGBA] [RGBA] [RGBA] ...
      //    ADLER32

      uint          adler = ComputeAdler32(data);
      MemoryStream  comp = new MemoryStream();
      
      // Calculate number of 64K blocks
      uint          rowsPerBlock = _MAXBLOCK/widthLength;
      uint          blockSize = rowsPerBlock*widthLength;
      uint          blockCount;
      ushort        length;
      uint          remainder=dcSize;
      
      if ((dcSize % blockSize) == 0)
      {
        blockCount = dcSize/blockSize;
      }
      else
      {
        blockCount = (dcSize/blockSize)+1;
      }
      
      // Write headers
      comp.WriteByte(0x78);
      comp.WriteByte(0xDA);
      
      for (uint blocks=0; blocks<blockCount; blocks++)
      {
        // Write LEN
        length = (ushort)((remainder < blockSize) ? remainder : blockSize);
        
        if (length == remainder)
        {
          comp.WriteByte(0x01);
        }
        else
        {
          comp.WriteByte(0x00);
        }
        
        comp.Write(BitConverter.GetBytes(length), 0, 2);
        
        // Write one's compliment of LEN
        comp.Write(BitConverter.GetBytes((ushort)~length), 0, 2);
       
        // Write blocks
        comp.Write(data, (int)(blocks*blockSize), length);
        
        // Next block
        remainder -= blockSize;
      }
      
      WriteReversedBuffer(comp, BitConverter.GetBytes(adler));
      comp.Seek(0, SeekOrigin.Begin);
 
      byte[] dat = new byte[comp.Length];
      comp.Read(dat, 0, (int)comp.Length);
      
      WriteChunk(ms, _IDAT, dat);

      // Write IEND chunk
      WriteChunk(ms, _IEND, new byte[0]);

      // Reset stream
      ms.Seek(0, SeekOrigin.Begin);
           
      return ms;

      // See http://www.libpng.org/pub/png//spec/1.2/PNG-Chunks.html       // See http://www.libpng.org/pub/png/book/chapter08.html#png.ch08.div.4       // See http://www.gzip.org/zlib/rfc-zlib.html (ZLIB format)
      // See ftp://ftp.uu.net/pub/archiving/zip/doc/rfc1951.txt (ZLIB compression format)
    }
    
    private static void WriteReversedBuffer(Stream stream, byte[] data)
    {
      int     size = data.Length;
      byte[]  reorder = new byte[size];

      for (int idx=0; idx<size; idx++)
      {
        reorder[idx] = data[size-idx-1];
      }
      stream.Write(reorder, 0, size);
    }

    private static void WriteChunk(Stream stream, byte[] type, byte[] data)
    {
      int     idx;
      int     size=type.Length;
      byte[]  buffer = new byte[type.Length + data.Length];
      
      // Initialize buffer
      for (idx=0; idx<type.Length; idx++)
      {
        buffer[idx] = type[idx];
      }

      for (idx=0; idx<data.Length; idx++)
      {
        buffer[idx+size] = data[idx];
      }
      
      // Write length
      WriteReversedBuffer(stream, BitConverter.GetBytes(data.Length));
     
      // Write type and data
      stream.Write(buffer, 0, buffer.Length);   // Should always be 4 bytes
          
      // Compute and write the CRC
      WriteReversedBuffer(stream, BitConverter.GetBytes(GetCRC(buffer)));
    }
     
    private static uint[] _crcTable = new uint[256];
    private static bool   _crcTableComputed = false;

    private static void MakeCRCTable()
    {
      uint c;

      for (int n = 0; n < 256; n++)
      {
        c = (uint)n;
        for (int k = 0; k < 8; k++)
        {
          if ((c & (0x00000001)) > 0)
            c = 0xEDB88320 ^ (c >> 1);
          else
            c = c >> 1;
        }
        _crcTable
 = c;
      }
  
      _crcTableComputed = true;
    }

    private static uint UpdateCRC(uint crc, byte[] buf, int len)
    {
      uint c = crc;

      if (!_crcTableComputed)
      {
        MakeCRCTable();
      }

      for (int n = 0; n < len; n++)
      {
        c = _crcTable[(c ^ buf
) & 0xFF] ^ (c >> 8);
      }

      return c;
    }

    /* Return the CRC of the bytes buf[0..len-1]. */
    private static uint GetCRC(byte[] buf)
    {
      return UpdateCRC(0xFFFFFFFF, buf, buf.Length) ^ 0xFFFFFFFF;
    }
        
    private static uint ComputeAdler32(byte[] buf)
    {
      uint  s1 = 1;
      uint  s2 = 0;
      int   length=buf.Length;

      for (int idx=0; idx<length; idx++)
      {
        s1 = (s1 + (uint)buf[idx]) % _ADLER32_BASE;
        s2 = (s2 + s1) % _ADLER32_BASE;
      }

      return (s2 << 16) + s1;
    }
  }
}


EditableImage.cs

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.IO;

namespace PlanningCtrl.UI
{
  public class EditableImage
  {
    private int                       _width=0;
    private int                       _height=0;
    private bool                      _init=false;
    private byte[]                    _buffer;
    private int                       _rowLength;

    public event EventHandler<EditableImageErrorEventArgs>    ImageError;
    
    public EditableImage(int width, int height)
    {
      this.Width = width;
      this.Height = height;
    }

    public int Width
    {
      get
      {
        return _width;
      }
      set
      {
        if (_init)
        {
          OnImageError("Error: Cannot change Width after the EditableImage has been initialized");
        }
        else if ((value <= 0) || (value > 4047))
        {
          OnImageError("Error: Width must be between 0 and 2047");
        }
        else
        {
          _width = value;
        }
      }
    }

    public int Height
    {
      get
      {
        return _height;
      }
      set
      {
        if (_init)
        {
          OnImageError("Error: Cannot change Height after the EditableImage has been initialized");
        }
        else if ((value <= 0) || (value > 2047))
        {
          OnImageError("Error: Height must be between 0 and 2047");
        }
        else
        {
          _height = value;
        }
      }
    }
    
    public void SetPixel(int col, int row, Color color)
    {
      SetPixel(col, row, color.R, color.G, color.B, color.A);
    }
    
    public void SetPixel(int col, int row, byte red, byte green, byte blue, byte alpha)
    {
      if (!_init)
      {
        _rowLength = _width*4 + 1;
        _buffer = new byte[_rowLength *_height];
 
        // Initialize
        for (int idx=0; idx<_height; idx++)
        {
          _buffer[idx*_rowLength] = 0;      // Filter bit
        }
 
        _init = true;
      }

      if ((col > _width) || (col < 0))
      {
        OnImageError("Error: Column must be greater than 0 and less than the Width");
      }
      else if ((row > _height) || (row < 0))
      {
        OnImageError("Error: Row must be greater than 0 and less than the Height");
      }
      
      // Set the pixel
      int   start = _rowLength*row + col*4 + 1;
      _buffer[start] = red;
      _buffer[start + 1] = green;
      _buffer[start + 2] = blue;
      _buffer[start + 3] = alpha;
    }
    
    public Color GetPixel(int col, int row)
    {
      if ((col > _width) || (col < 0))
      {
        OnImageError("Error: Column must be greater than 0 and less than the Width");
      }
      else if ((row > _height) || (row < 0))
      {
        OnImageError("Error: Row must be greater than 0 and less than the Height");
      }
      
      Color color = new Color();
      int   _base = _rowLength * row + col + 1;

      color.R = _buffer[_base];
      color.G = _buffer[_base + 1];
      color.B = _buffer[_base + 2];
      color.A = _buffer[_base + 3];
      
      return color;
    }
    
    public Stream GetStream()
    {
      Stream  stream;
 
      if (!_init)
      {
        OnImageError("Error: Image has not been initialized");
        stream = null;
      }
      else
      {
        stream = PngEncoder.Encode(_buffer, _width, _height);
      }
      
      return stream;
    }
 
    private void OnImageError(string msg)
    {
      if (null != ImageError)
      {
        EditableImageErrorEventArgs args = new EditableImageErrorEventArgs();
        args.ErrorMessage = msg;
        ImageError(this, args);
      }
    }
    
    public class EditableImageErrorEventArgs : EventArgs
    {
      private string    _errorMessage=string.Empty;
      
      public string ErrorMessage
      {
        get { return _errorMessage; }
        set { _errorMessage = value; }
      }
    }
    
  }
}


5,为ScrollViewer增加MouseWheel 支持

void MainScroll_MouseWheel(object sender, MouseWheelEventArgs e)
        {
            ScrollViewer viewer = sender as ScrollViewer;

            if (!e.Handled)
            {
                double offsite = viewer.VerticalOffset - e.Delta;
                viewer.ScrollToVerticalOffset(offsite);
                e.Handled = true;
            }
        }


6,ToolTip设计

<ToolTipService.ToolTip>
            <ToolTip Loaded="ToolTip_Loaded"    >
                    <Grid ShowGridLines="False" >
                        <Grid.RowDefinitions>
                            <RowDefinition></RowDefinition>
                            <RowDefinition></RowDefinition>
                            <RowDefinition></RowDefinition>
                            <RowDefinition></RowDefinition>
                        </Grid.RowDefinitions>

                        <Grid.ColumnDefinitions>
                            <ColumnDefinition></ColumnDefinition>
                            <ColumnDefinition></ColumnDefinition>
                        </Grid.ColumnDefinitions>

                        <TextBlock x:Name="LbDueOn" Text="DueOn:" Grid.Row="0" Grid.Column="0"></TextBlock>
                        <TextBlock x:Name="DueOnTextBlock" Grid.Row="0" Grid.Column="1"></TextBlock>
                        <TextBlock x:Name="lbDueOff" Text="DueOff:" Grid.Row="1" Grid.Column="0"></TextBlock>
                        <TextBlock x:Name="DueOffTextBlock" Grid.Row="1" Grid.Column="1"></TextBlock>
                        <TextBlock x:Name="lbEmployee" Text="EName:" Grid.Row="2" Grid.Column="0"></TextBlock>
                        <TextBlock x:Name="ETextBlock" Grid.Row="2" Grid.Column="1"></TextBlock>
                        <TextBlock x:Name="lbStatus" Text="S:" Grid.Row="3" Grid.Column="0"></TextBlock>
                        <TextBlock x:Name="STextBlock" Grid.Row="3" Grid.Column="1"></TextBlock>
                    </Grid>
            </ToolTip>
        </ToolTipService.ToolTip>


7,自定义的MessageBox

详见:http://www.cnblogs.com/hedonister/archive/2009/08/02/1537142.html

8,定义Control的热区

protected void SetHotAreaCursor(FrameworkElement targetElement, double xOffsiteElment)
        {
            // Set the hot area
            if (xOffsiteElment > this.Width * 0.03 && xOffsiteElment < this.Width * 0.97)
            {
                targetElement.Cursor = Cursors.Hand;
            }
            else
            {
                targetElement.Cursor = Cursors.SizeWE;
            }
        }


9,child Window和父窗口传值

public partial class testChildWindow : ChildWindow
      {
          public string testString { get; set; }
         public testChildWindow()
          {
              InitializeComponent();
         }
  
          private void OKButton_Click(object sender, RoutedEventArgs e)
         {
             testString = DateTime.Now.ToString();
             this.DialogResult = true;
         }
 
         private void CancelButton_Click(object sender, RoutedEventArgs e)
         {
             this.DialogResult = false;
         }
     }

  testChildWindow tc = new testChildWindow();   //实例化弹出窗口
          public SilverlightControl1()
          {
              InitializeComponent();
              tc.Closed += new EventHandler(tc_Closed);  //弹出窗口的关闭事件
              this.Loaded += new RoutedEventHandler(SilverlightControl1_Loaded);
          }
  
          void SilverlightControl1_Loaded(object sender, RoutedEventArgs e)
         {
             tc.Show(); //弹出窗口
         }
 
         void tc_Closed(object sender, EventArgs e)
         {
             string val = tc.testString;//返回的值
         }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: