Una de las cosas que más llaman la atención de la aplicación que desarrollamos en el Web Day (Mi Bolsa) es la gráfica de cotizaciones.
La gráfica se genera en tiempo real en servidor y toma como parámetro el símbolo de la empresa y la fecha final. Aquí lo tenéis en un ejemplo en vivo, podéis poner cualquier símbolo de una empresa (ej. MSFT, AABC, MSN...) y una fecha. Al pinchar en el botón la gráfica se actualiza en servidor (por cierto los valores mostrados son aleatorios...):
Símbolo: Fecha:
La técnica utilizada para hacerlo es bastante antigua, pero con un toquecillo de WPF. En la página web sólo hay un elemento IMG cuya propiedad SRC se establece a una dirección de una página ASP.NET de servidor. Esta página toma como parámetros el ancho y alto, la empresa y la fecha y genera dinámicamente una imagen en el servidor en formato JPEG.
Los principales trucos para hacer que esto funcione:
Response.ContentType = "image/jpeg"
public byte[] DrawChart(){ PixelFormat pf = PixelFormats.Bgr32; MemoryStream memStream = new MemoryStream(); DrawingVisual drawingVisual = new DrawingVisual(); DrawingContext drawingContext = drawingVisual.RenderOpen(); DrawBackground(drawingContext); DrawAxis(drawingContext); DrawGrid(drawingContext); for(int i=0;i<_values.Count;i++) DrawValues(drawingContext, i); DrawAxisText(drawingContext); drawingContext.Close(); RenderTargetBitmap renderBitmap = new RenderTargetBitmap (_width, _height, 96, 96, PixelFormats.Pbgra32); renderBitmap.Render(drawingVisual); JpegBitmapEncoder encoder = new JpegBitmapEncoder(); encoder.Frames.Add(BitmapFrame.Create(renderBitmap)); encoder.Save(memStream); return memStream.GetBuffer();}
public byte[] DrawChart(){ PixelFormat pf = PixelFormats.Bgr32; MemoryStream memStream = new MemoryStream();
DrawingVisual drawingVisual = new DrawingVisual(); DrawingContext drawingContext = drawingVisual.RenderOpen();
DrawBackground(drawingContext); DrawAxis(drawingContext); DrawGrid(drawingContext); for(int i=0;i<_values.Count;i++) DrawValues(drawingContext, i); DrawAxisText(drawingContext);
drawingContext.Close();
RenderTargetBitmap renderBitmap = new RenderTargetBitmap (_width, _height, 96, 96, PixelFormats.Pbgra32); renderBitmap.Render(drawingVisual);
JpegBitmapEncoder encoder = new JpegBitmapEncoder(); encoder.Frames.Add(BitmapFrame.Create(renderBitmap)); encoder.Save(memStream);
return memStream.GetBuffer();}