<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5802880096398782912</id><updated>2011-07-30T19:43:02.618+02:00</updated><category term='WCF Streaming'/><category term='Windows Mobile'/><category term='WPF ItemsPanel ListBox'/><category term='iPhone'/><category term='WPF Datatemplate Trigger'/><category term='WCF WPF Binding endpoint no config'/><category term='Android'/><category term='CodeCamp Tarragona CatDotNet'/><category term='WPF XBAP browsed'/><title type='text'>Recursos NET</title><subtitle type='html'>Recursos .NET pretende ser una Herramienta de Ayuda al programador NET dando respuesta desde un punto de vista práctico. Consta de una lista de posts con utilidades y soluciones obtenidas a partir de nuestras necesidades diarias.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://recursosdotnet.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5802880096398782912/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://recursosdotnet.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Roger Farrés</name><uri>http://www.blogger.com/profile/10573664081029568895</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/__kltecQQkPA/SzNDuCd_OEI/AAAAAAAAABE/9k_aXK1wP0Q/S220/DSC_0014.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>14</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5802880096398782912.post-1529941027758688725</id><published>2010-03-16T10:18:00.003+01:00</published><updated>2010-03-16T18:30:25.562+01:00</updated><title type='text'>Herramietas Desarrollo Windows Phone 7</title><content type='html'>En el MIX2010, se ha anunciado que ya se pueden descargar las herramientas de desarrollo para el Windows Phone 7. El cambio es tan radical, que necesitan ya que los programadores nos reciclemos, por lo que las herramientas son gratuitas, y espero que la documentación proporcionada sea buena.&lt;br /&gt;&lt;br /&gt;Os dejo el link para la descarga.&lt;br /&gt;&lt;a href="http://developer.windowsphone.com/windows-phone-7-series/"&gt;http://developer.windowsphone.com/windows-phone-7-series/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Actualizo la información incluyendo dos links, uno  un libro gratuito sobre el desarrollo y otro a varios ejemplos que nos pueden servir.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://download.microsoft.com/download/7/C/8/7C820C6F-C205-4ECF-B9F3-1505DD13F9BF/ProgWinPhonePreview.pdf"&gt;http://download.microsoft.com/download/7/C/8/7C820C6F-C205-4ECF-B9F3-1505DD13F9BF/ProgWinPhonePreview.pdf&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://download.microsoft.com/download/1/D/B/1DB49641-3956-41F1-BAFA-A021673C709E/CodeSamples_DRAFTPreview_ProgrammingWindowsPhone7Series.zip"&gt;http://download.microsoft.com/download/1/D/B/1DB49641-3956-41F1-BAFA-A021673C709E/CodeSamples_DRAFTPreview_ProgrammingWindowsPhone7Series.zip&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5802880096398782912-1529941027758688725?l=recursosdotnet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://recursosdotnet.blogspot.com/feeds/1529941027758688725/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5802880096398782912&amp;postID=1529941027758688725' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5802880096398782912/posts/default/1529941027758688725'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5802880096398782912/posts/default/1529941027758688725'/><link rel='alternate' type='text/html' href='http://recursosdotnet.blogspot.com/2010/03/herramietas-desarrollo-windows-phone-7.html' title='Herramietas Desarrollo Windows Phone 7'/><author><name>Roger Farrés</name><uri>http://www.blogger.com/profile/10573664081029568895</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/__kltecQQkPA/SzNDuCd_OEI/AAAAAAAAABE/9k_aXK1wP0Q/S220/DSC_0014.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5802880096398782912.post-2257225228751439297</id><published>2010-01-22T11:00:00.002+01:00</published><updated>2010-01-22T11:07:22.596+01:00</updated><title type='text'>Videos del codeCamp de Tarrgaona 2009</title><content type='html'>Finalmente ya están disponibles los videos del CodeCamp de Tarrgona 2009.&lt;br /&gt;Os dejo el link para acceder a ellos. También os dejo un link para acceder al material de las sesiones.&lt;br /&gt;A disfurtarlo!!!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.secondnug.com/CodeCamp2009/tabid/94/Default.aspx"&gt;Acceso Videos CodeCamp&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.codecamp.es/Speakers.aspx"&gt;Acceso Material Sesiones&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5802880096398782912-2257225228751439297?l=recursosdotnet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://recursosdotnet.blogspot.com/feeds/2257225228751439297/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5802880096398782912&amp;postID=2257225228751439297' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5802880096398782912/posts/default/2257225228751439297'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5802880096398782912/posts/default/2257225228751439297'/><link rel='alternate' type='text/html' href='http://recursosdotnet.blogspot.com/2010/01/videos-del-codecamp-de-tarrgaona-2009.html' title='Videos del codeCamp de Tarrgaona 2009'/><author><name>Roger Farrés</name><uri>http://www.blogger.com/profile/10573664081029568895</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/__kltecQQkPA/SzNDuCd_OEI/AAAAAAAAABE/9k_aXK1wP0Q/S220/DSC_0014.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5802880096398782912.post-4441038208917069518</id><published>2009-12-24T11:20:00.002+01:00</published><updated>2009-12-24T11:30:48.113+01:00</updated><title type='text'>NetCFSvcUtil y Windows 7</title><content type='html'>Para crear un cliente WCF en Compact Framework, es más que aconsejable utilizar las Power Toys de Compact Framework 3.5, que podeis encontrar en este &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=c8174c14-a27d-4148-bf01-86c2e0953eab&amp;amp;displaylang=en"&gt;enlace&lt;/a&gt;. Entre las herramientas que nos proporciona, existe el NETCFSvcUtil.exe que nos genera código para incluir en nuestras aplicaciones y poder acceder a servicios WCF de manera correcta.&lt;br /&gt;En Windows 7, al ejecutar esta utilidad siempre nos devuelve el error:&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;Error: An error occurred in the tool.&lt;br /&gt;Error: Error in the application&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Afortunadamente, el equipo de windows Mobile ha publicado una nueva versión que funciona correctamente y sin problemas en el nuevo Sistema operativo de Microsoft. Os paso el link directo al nuevo exe.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://download.microsoft.com/download/6/2/0/6205ED05-E435-44FC-AA82-B763CA5F8B1A/NetCFSvcUtil.exe"&gt;NETCFSvcUtil.exe&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5802880096398782912-4441038208917069518?l=recursosdotnet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://recursosdotnet.blogspot.com/feeds/4441038208917069518/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5802880096398782912&amp;postID=4441038208917069518' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5802880096398782912/posts/default/4441038208917069518'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5802880096398782912/posts/default/4441038208917069518'/><link rel='alternate' type='text/html' href='http://recursosdotnet.blogspot.com/2009/12/netcfsvcutil-y-windows-7.html' title='NetCFSvcUtil y Windows 7'/><author><name>Roger Farrés</name><uri>http://www.blogger.com/profile/10573664081029568895</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/__kltecQQkPA/SzNDuCd_OEI/AAAAAAAAABE/9k_aXK1wP0Q/S220/DSC_0014.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5802880096398782912.post-8768585024903690336</id><published>2009-09-24T09:47:00.008+02:00</published><updated>2009-09-24T10:09:35.425+02:00</updated><title type='text'>Codecamp Tarragona 2009. Registro Abierto...</title><content type='html'>&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/__kltecQQkPA/Srsmh9S65sI/AAAAAAAAAA0/hGoYFf_HP30/s1600-h/sticker2.png"&gt;&lt;img style="MARGIN: 0px 10px 10px 0px; WIDTH: 112px; FLOAT: left; HEIGHT: 66px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5384940144283018946" border="0" alt="" src="http://3.bp.blogspot.com/__kltecQQkPA/Srsmh9S65sI/AAAAAAAAAA0/hGoYFf_HP30/s320/sticker2.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Bueno, pues eso, finalmente ya se ha abierto el registro del &lt;span id="SPELLING_ERROR_0" class="blsp-spelling-error"&gt;Codecamp&lt;/span&gt; de &lt;span id="SPELLING_ERROR_1" class="blsp-spelling-error"&gt;Tarragona&lt;/span&gt; el 17 y 18 de Octubre. Creo que el nivel y el enfoque de las sesiones es muy interesante, y que vamos a disfrutar mucho con el evento.&lt;br /&gt;Os animo que os registréis ya, hace pocos días que se ha abierto el registro y ya hay muchos inscritos, por lo que no os durmáis, &lt;span id="SPELLING_ERROR_2" class="blsp-spelling-error"&gt;ok&lt;/span&gt;?&lt;br /&gt;Por los que aún vais despistados os paso un &lt;span id="SPELLING_ERROR_3" class="blsp-spelling-error"&gt;link&lt;/span&gt; a la &lt;a href="http://www.codecamp.es/"&gt;&lt;span id="SPELLING_ERROR_4" class="blsp-spelling-error"&gt;web&lt;/span&gt;&lt;/a&gt; y a las &lt;a href="http://www.codecamp.es/Sesiones.aspx"&gt;sesiones&lt;/a&gt;. &lt;/div&gt;&lt;br /&gt;&lt;div&gt;Dar desde este modesto blog las gracias a los &lt;span id="SPELLING_ERROR_5" class="blsp-spelling-error"&gt;patrocinadores&lt;/span&gt; por confiar en la &lt;span id="SPELLING_ERROR_6" class="blsp-spelling-error"&gt;organización&lt;/span&gt;. &lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 320px; DISPLAY: block; HEIGHT: 65px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5384942376654848946" border="0" alt="" src="http://2.bp.blogspot.com/__kltecQQkPA/Srsoj5h1w7I/AAAAAAAAAA8/VZwbKnb6CP8/s320/sponsors.PNG" /&gt;&lt;br /&gt;Nos vemos en &lt;span id="SPELLING_ERROR_7" class="blsp-spelling-error"&gt;Tarragona&lt;/span&gt;!!!!!&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5802880096398782912-8768585024903690336?l=recursosdotnet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://recursosdotnet.blogspot.com/feeds/8768585024903690336/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5802880096398782912&amp;postID=8768585024903690336' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5802880096398782912/posts/default/8768585024903690336'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5802880096398782912/posts/default/8768585024903690336'/><link rel='alternate' type='text/html' href='http://recursosdotnet.blogspot.com/2009/09/codecamp-tarragona-2009-registro.html' title='Codecamp Tarragona 2009. Registro Abierto...'/><author><name>Roger Farrés</name><uri>http://www.blogger.com/profile/10573664081029568895</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/__kltecQQkPA/SzNDuCd_OEI/AAAAAAAAABE/9k_aXK1wP0Q/S220/DSC_0014.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/__kltecQQkPA/Srsmh9S65sI/AAAAAAAAAA0/hGoYFf_HP30/s72-c/sticker2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5802880096398782912.post-5611164927419921154</id><published>2009-09-18T12:36:00.001+02:00</published><updated>2009-09-18T12:56:39.270+02:00</updated><title type='text'>XBAP y Security Exception al cargar referencias a ensamblados</title><content type='html'>EL otro día estábamos ultimando la entrega de una aplicación XBAP. En algunos casos, tenemos el proyecto definido en Full Trust, y en el momento de publicarlo lo pasamos a Partial para realizar las pruebas y validaciones.&lt;br /&gt;Cuál fue nuestra sorpresa, que  al pasar la aplicación a Partial, ésta no era capaz ni de mostrar la pantalla de inicio, ya que al intentar cargar los ensamblados referenciados, saltaba por Security Exception. Como todo buen programador :), pasamos a la fase debugger para ver lo que está pasando y cuál es el trozo de código no permitido … pues en entorno de depuración imposible, el propio VS no es capaz de cargar el ensamblado y sigue dando la Security Exception sin llegar a depurar ni una línea de código que hace referencia al ensamblado. La siguiente opción que haría todo el mundo, es integrar el código del ensamblado en el mismo proyecto y ejecutar… resultado: FUNCIONA!!! &lt;br /&gt;Entonces, por qué nos está dando la excepción de seguridad? No queremos el código en el mismo proyecto, ya que el ensamblado referenciado es base en todos nuestros proyectos WPF/XBAP. Siguiendo con la ‘investigación’, descubrimos que el ultimo que había compilado el ensamblado lo había hecho en configuración de Debug, con lo que el ensamblado incorpora información para su posterior tratamiento. Recompilamos el ensamblado en Release, y todo perfecto. A funcionar correctamente!!!&lt;br /&gt;Este post sólo tiene por objetivo intentar ahorrar  un poco de tiempo a alguien que le pase lo mismo que a nosotros, o sea que recordad: No publiquéis nada compilado en Debug, pues en entornos Partial Trust provoca Security Exception.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5802880096398782912-5611164927419921154?l=recursosdotnet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://recursosdotnet.blogspot.com/feeds/5611164927419921154/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5802880096398782912&amp;postID=5611164927419921154' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5802880096398782912/posts/default/5611164927419921154'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5802880096398782912/posts/default/5611164927419921154'/><link rel='alternate' type='text/html' href='http://recursosdotnet.blogspot.com/2009/09/xbap-y-security-exception-al-cargar.html' title='XBAP y Security Exception al cargar referencias a ensamblados'/><author><name>Roger Farrés</name><uri>http://www.blogger.com/profile/10573664081029568895</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/__kltecQQkPA/SzNDuCd_OEI/AAAAAAAAABE/9k_aXK1wP0Q/S220/DSC_0014.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5802880096398782912.post-3290878668927743917</id><published>2009-07-16T08:18:00.004+02:00</published><updated>2009-07-16T08:31:05.839+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CodeCamp Tarragona CatDotNet'/><title type='text'>Codecamp Tarragona 2009</title><content type='html'>&lt;a href="http://4.bp.blogspot.com/__kltecQQkPA/Sl7G3djmBwI/AAAAAAAAAAs/rEfqyB6Vjr4/s1600-h/Banner5.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 160px; height: 66px;" src="http://4.bp.blogspot.com/__kltecQQkPA/Sl7G3djmBwI/AAAAAAAAAAs/rEfqyB6Vjr4/s320/Banner5.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5358939262746494722" /&gt;&lt;/a&gt;&lt;br /&gt;Finalmente ya es oficial. Los grupos de usuarios de CatDotNet, BCNDEV, Spain.NET, Second NUG, LoNet Camp y Andorra.NET se han unido para organizar un CodeCamp en Tarragona el 17 y 18 de Octubre.&lt;br /&gt;&lt;br /&gt;CodeCamp Tarragona 2009 es un evento gratuito organizado por y para la comunidad de .NET, cuyo objetivo es reunir a profesionales, usuarios y entusiastas interesados en la plataforma .NET y Mono para intercambiar experiencias y asistir a un conjunto de ponencias realizadas por especialistas de reconocido prestigio.&lt;br /&gt;&lt;br /&gt;Os paso &lt;a href="http://www.codecamp.es"&gt;link&lt;/a&gt; a la web oficial. Ahí podéis encontrar más información y documentación por si os interesa colaborar de alguna manera.Nos vemos en Tarragona!!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5802880096398782912-3290878668927743917?l=recursosdotnet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://recursosdotnet.blogspot.com/feeds/3290878668927743917/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5802880096398782912&amp;postID=3290878668927743917' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5802880096398782912/posts/default/3290878668927743917'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5802880096398782912/posts/default/3290878668927743917'/><link rel='alternate' type='text/html' href='http://recursosdotnet.blogspot.com/2009/07/codecamp-tarragona-2009.html' title='Codecamp Tarragona 2009'/><author><name>Roger Farrés</name><uri>http://www.blogger.com/profile/10573664081029568895</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/__kltecQQkPA/SzNDuCd_OEI/AAAAAAAAABE/9k_aXK1wP0Q/S220/DSC_0014.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/__kltecQQkPA/Sl7G3djmBwI/AAAAAAAAAAs/rEfqyB6Vjr4/s72-c/Banner5.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5802880096398782912.post-6462232041249716102</id><published>2009-07-03T11:52:00.003+02:00</published><updated>2009-07-03T12:11:23.473+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Mobile'/><title type='text'>Android... que maravilla!!!</title><content type='html'>Aunque me aparte un poco del objetivo del blog, me muero de ganas de hacer este comentario: Android.. qué maravilla!!!!&lt;br /&gt;Finalmente ha caído una HTC Magic en mis manos. Primera impresión muy buena. Hacía tiempo que no me sorprendía nada de esta manera. &lt;br /&gt;Ya sé que iPhone rompió con con la usabilidad en dispositivos (y comparto la afirmación), pero me da un poco de rabia la propaganda gratuita que se da a todo lo que hace Apple como si fuera lo mejor por definición, y cuando aparecen otros sistemas, mejores en mi opinión incluso a nivel usable, no se da la importancia que se merece. Además, quiero recalcar lo difícil, tosco, complicado y cerrado que es hacer algo en iPhone. &lt;br /&gt;Todo esto obliga a Microsoft a ponerse las pilas. La Mobile 6.5, por lo que hemos visto en betas y en emuladores, tampoco es que aporte mucho respecto la 6.1. Sí que mejora un poco los menús de navegación, pero es un poco más de lo mismo, y por lo que parece, la esperada 7.0 va a tardar más de lo previsto. &lt;br /&gt;Esperemos que esta 'batalla' mejore los tres sistemas, y estos nos aporten nuevas funcionalidades, a los usuarios finales y a los que vivimos de esto, que en definitiva es lo que nos interesa.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5802880096398782912-6462232041249716102?l=recursosdotnet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://recursosdotnet.blogspot.com/feeds/6462232041249716102/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5802880096398782912&amp;postID=6462232041249716102' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5802880096398782912/posts/default/6462232041249716102'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5802880096398782912/posts/default/6462232041249716102'/><link rel='alternate' type='text/html' href='http://recursosdotnet.blogspot.com/2009/07/android-que-maravilla.html' title='Android... que maravilla!!!'/><author><name>Roger Farrés</name><uri>http://www.blogger.com/profile/10573664081029568895</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/__kltecQQkPA/SzNDuCd_OEI/AAAAAAAAABE/9k_aXK1wP0Q/S220/DSC_0014.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5802880096398782912.post-7469861547102646813</id><published>2009-02-01T12:33:00.032+01:00</published><updated>2009-02-01T18:19:13.060+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WCF Streaming'/><title type='text'>WCF y Streaming (2/2)</title><content type='html'>Uff.. cuanto tiempo sin escribir!!!. Pido disculpas a los que seguís el blog ... Sólo quiero desde aquí dar ánimos a los que están pasando un mal momento, intentando responder a preguntas sin respuesta y tener un recuerdo muy especial para los que se han ido de nuestro lado pero que tendremos muy a menudo en nuestros pensamientos.&lt;br /&gt;&lt;br /&gt;Vamos a lo que os interesa: En la primera parte del post, vemos el streaming desde la parte servidor. Ahora vamos a ver la parte cliente, y como podemos monitorizar el estado del envío/recepción y así informar al usuario del estado del proceso.&lt;br /&gt;&lt;br /&gt;El primer paso es hacer referencia al servicio creado. Para hacer esto desde cliente Framework, podemos utilizar directamente el proxy creado por el asistente de agregar referencia de servicio de Visual Studio. Éste ya nos traduce los Message Contract a parámetros de llamada. Hasta ahí ningún problema, ya que podemos hacer referencia al endpoint streamed y llamar al método que nos proporciona o nos permite enviar los datos necesarios. Sólo un par de comentarios: &lt;br /&gt;1-. Ésto no funciona para Compact Framework, por lo que si necesitamos hacer referencia a un mismo servicio desde Framework y desde CF, necesitaríamos compilaciones distintas (pero esto ya da para otro post, ya que las referencias de servicio WCF en CF son un poco especiales. Si alguien necesita ayuda en este tema y no he publicado el post, que no dude en enviarme una mail)&lt;br /&gt;2-. Para crear el client streamed, podemos utilizar el binding que os propongo en uno de mis &lt;a href="http://recursosdotnet.blogspot.com/2008/06/cliente-wcf-sin-archivo-de-configuracin.html"&gt;primeros posts&lt;/a&gt; cambiando el transfermode de Buffered a Streamed (Acordaros que el Mtom no funciona en partial trust, con lo que el MessageEncoding tiene que ser Text para XBAP en Partial Trust).&lt;br /&gt;&lt;br /&gt;Una vez visto esto, vamos a ver como lo hacemos para monitorizar el estado del envío/recepción del stream. Para hacerlo, nos ayudamos de una clase que hereda directamente de Stream, y donde sobreescribimos los métodos de lectura para lanzar nuestro propio evento.&lt;br /&gt;&lt;br /&gt;public class StreamWithProgress : Stream {&lt;br /&gt;&amp;nbsp;private readonly MemoryStream memData;&lt;br /&gt;&amp;nbsp;private readonly long length;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;public class ProgressChangedEventArgs : EventArgs {&lt;br /&gt;&amp;nbsp;&amp;nbsp;public long BytesRead;&lt;br /&gt;&amp;nbsp;&amp;nbsp;public long Length;&lt;br /&gt;&amp;nbsp;&amp;nbsp;public ProgressChangedEventArgs(long BytesRead, long Length) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.BytesRead = BytesRead;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.Length = Length;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;public event EventHandler&lt;ProgressChangedEventArgs&gt; ProgressChanged;&lt;br /&gt;&amp;nbsp;private long bytesRead;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;public StreamWithProgress(MemoryStream data) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;this.memData = data;&lt;br /&gt;&amp;nbsp;&amp;nbsp;length = data.Length;&lt;br /&gt;&amp;nbsp;&amp;nbsp;bytesRead = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;if (ProgressChanged != null) ProgressChanged(this, new ProgressChangedEventArgs(bytesRead, length));&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;public double GetProgress() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;return ((double)bytesRead) / memData.Length;&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;public override bool CanRead {&lt;br /&gt;&amp;nbsp;&amp;nbsp;get { return true; }&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;public override bool CanSeek {&lt;br /&gt;&amp;nbsp;&amp;nbsp;get { return false; }&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;public override bool CanWrite {&lt;br /&gt;&amp;nbsp;&amp;nbsp;get { return false; }&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;public override void Flush() { }&lt;br /&gt;&amp;nbsp;public override long Length {&lt;br /&gt;&amp;nbsp;&amp;nbsp;get { return length; }&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;public override long Position {&lt;br /&gt;&amp;nbsp;&amp;nbsp;get { return bytesRead; }&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;public override int Read(byte[] buffer, int offset, int count) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;int result = memData.Read(buffer, offset, count);&lt;br /&gt;&amp;nbsp;&amp;nbsp;bytesRead += result;&lt;br /&gt;&amp;nbsp;&amp;nbsp;if (ProgressChanged != null) ProgressChanged(this, new ProgressChangedEventArgs(bytesRead, length));&lt;br /&gt;&amp;nbsp;&amp;nbsp;return result;&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Como utilizamos la clase:&lt;br /&gt;Para hacer una subida de datos, lo hacemos de la siguiente manera&lt;br /&gt;&lt;br /&gt;using(StreamWithProgress uploadStreamWithProgress = new StreamWithProgress(stream)) {&lt;br /&gt;&amp;nbsp;uploadStreamWithProgress.ProgressChanged += new EventHandler&lt;StreamWithProgress.ProgressChangedEventArgs&gt;(uploadStreamWithProgress_ProgressChanged);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;//Llamamos al web method streamed.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;//donde uno de los parámetros será el stream&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!comm.serverSaveProjectStream(stream, xxx)) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//Error&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//do action;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Como podeis ver, el Stream de los datos lo tenemos en la variable stream, y el delegado donde efectuamos la acción de informar al usuario del progreso de la transacción es uploadStreamWithProgress_ProgressChanged. No creo que haga falta cometntar más, ya que la filosofia de como funciona parece bastante clara.&lt;br /&gt;&lt;br /&gt;En el caso de una lectura de un stream, NO utilizamos esta clase. Lo que haremos es hacer una llamada al método WCF que nos proporciona el stream, y una vez finalizada la llamada leer los datos por bloques e informar al usuario de estado de la transacción. El código podria ser este:&lt;br /&gt;&lt;br /&gt;//Llamamos al método WCF que devuelve el stream&lt;br /&gt;if (!comm.serverLoadProjectStream(xxx, out stream, out streamLength)) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;//Error&lt;br /&gt;&amp;nbsp;&amp;nbsp;//Do action&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//Leeremos el stream y lo cargaremos en el byte []&lt;br /&gt;byte[] byteTmp = new byte[streamLength];&lt;br /&gt;&lt;br /&gt;//chunkSize es el tamaño del bloque de lectura&lt;br /&gt;byte[] chunkData = new byte[chunkSize];&lt;br /&gt;//Temporal para saber lo que hemos escrito en el buffer de salida&lt;br /&gt;int offsetBuffer = 0;       &lt;br /&gt;//Bytes leidos en cada lectura. A cero cuando llegeumos al final&lt;br /&gt;int bytesRead = 0;  &lt;br /&gt;                &lt;br /&gt;do {&lt;br /&gt;&amp;nbsp;&amp;nbsp;//Leemos y guardamos en el buffer &lt;br /&gt;&amp;nbsp;&amp;nbsp;bytesRead = stream.Read(chunkData, 0, chunkSize);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;Array.Copy(chunkData, 0, byteTmp, offsetBuffer, bytesRead);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;//Actualizamos el offset del buffer&lt;br /&gt;&amp;nbsp;&amp;nbsp;offsetBuffer += bytesRead;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;//Informamos del progreso de la operación&lt;br /&gt;&amp;nbsp;&amp;nbsp;actualitzaWCFProgress(offsetBuffer, streamLength);&lt;br /&gt;&lt;br /&gt;} while (bytesRead != 0);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;En principio, esto es todo. Espero esto os sirva de ayuda como base para desarrollar vustro propio código. a mi personalmente, me ha sido de mucha ayuda.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5802880096398782912-7469861547102646813?l=recursosdotnet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://recursosdotnet.blogspot.com/feeds/7469861547102646813/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5802880096398782912&amp;postID=7469861547102646813' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5802880096398782912/posts/default/7469861547102646813'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5802880096398782912/posts/default/7469861547102646813'/><link rel='alternate' type='text/html' href='http://recursosdotnet.blogspot.com/2009/02/wcf-y-streaming-22.html' title='WCF y Streaming (2/2)'/><author><name>Roger Farrés</name><uri>http://www.blogger.com/profile/10573664081029568895</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/__kltecQQkPA/SzNDuCd_OEI/AAAAAAAAABE/9k_aXK1wP0Q/S220/DSC_0014.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5802880096398782912.post-7607597983738286682</id><published>2008-12-18T08:24:00.015+01:00</published><updated>2008-12-18T08:45:41.135+01:00</updated><title type='text'>WCF y Streaming (1/2)</title><content type='html'>&lt;div align="left"&gt;Recientemente he tenido la necesidad de pasar un gran volumen de información entre cliente y servidor y viceversa. Trabajando con métodos / operaciones WCF se abren algunos problemas: el tiempo de espera del cliente puede ser excesivo, limites en el volumen de información y el no tener el control sobre el proceso global de ejecución. Estos problemas los resuelve Streaming: un mensaje WCF puede ser Buffered que significa que acumula la transferencia en un buffer y termina cuando se han procesado la totalidad de los datos, o puede ser Streamed que significa que el consumidor procesa el mensaje a medida lo va recibiendo.&lt;br /&gt;Por lo tanto, Streaming nos permite procesar volúmenes grandes de información, teniendo control sobre el estado de la llamada y pudiendo dar información al usuario del proceso global del sistema. Vamos a ver los pasos necesarios para realizar llamadas de este tipo:&lt;br /&gt;Primero tenemos que crear un nuevo endpoint en el servicio para poder compaginar los dos tipos de llamadas. El binding en mi caso es Basic. Tenemos que crear un nuevo Binding cambiando el TransferMode a Streamed y lo asignamos al nuevo endpoint. Así queda mi web.config&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;basicHttpBinding&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;binding name="basicHttpBinding" maxReceivedMessageSize="xxx" maxBufferSize="xxx"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;readerQuotas maxArrayLength="xxx" maxStringContentLength="xxx"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/binding&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;binding name="basicHttpBindingStreamed" maxReceivedMessageSize="xxx" maxBufferSize="xxx" transferMode="Streamed"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;readerQuotas maxArrayLength="xxx" maxStringContentLength="xxx"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/binding&amp;gt;&lt;br /&gt;&amp;lt;/basicHttpBinding&amp;gt;&lt;br /&gt;&amp;lt;endpoint address="http://xxx/zzz.svc/NoStream" binding="basicHttpBinding" bindingConfiguration="basicHttpBinding" name="basicHTTP" contract="aaaa.bbb"/&amp;gt;&lt;br /&gt;&amp;lt;endpoint address="http://xxx/zzz.svc/Streamed" binding="basicHttpBinding" bindingConfiguration="basicHttpBindingStreamed" name="basicHTTPStreamed" contract="aaa.bbb"/&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Una vez definido el nuevo endpoint, tenemos que definir las operaciones del servicio. Cuando trabajamos en Streamed, tenemos la limitación de sólo poder tener un único parámetro de entrada y un único parámetro de salida. Esto nos obliga a trabajar con una clase que contendrá el Stream y la información adicional que necesitamos. Esta clase la tenemos que marcar con el atributo MessageContract. Los datos adicionales viajaran en la cabecera del mensaje, mientras que el Stream tiene que estar en el cuerpo del mismo. La clase puede quedar de esta manera.&lt;br /&gt;&lt;/div&gt;&lt;p align="justify"&gt;&lt;br /&gt;[MessageContract]&lt;br /&gt;public class CustomActionRequest : IDisposable {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;[MessageHeader(MustUnderstand = true)]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public int dato1; //Dato 1 de la clase&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;[MessageHeader(MustUnderstand = true)]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public string dato2; //Dato 2 de la clase&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;[MessageBodyMember(Order = 1)]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public System.IO.Stream byteStream; //Datos stream&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public void Dispose() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (byteStream != null) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;byteStream.Close ();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;byteStream = null;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Hasta aqui la parte de servidor. En mi caso me he creado una clase para el Request y otra para el Response. En el siguiente Post veremos la parte cliente, es decir, como efectuamos la llamada y como monitorizamos el flujo del proceso.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5802880096398782912-7607597983738286682?l=recursosdotnet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://recursosdotnet.blogspot.com/feeds/7607597983738286682/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5802880096398782912&amp;postID=7607597983738286682' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5802880096398782912/posts/default/7607597983738286682'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5802880096398782912/posts/default/7607597983738286682'/><link rel='alternate' type='text/html' href='http://recursosdotnet.blogspot.com/2008/12/wcf-y-streaming-12.html' title='WCF y Streaming (1/2)'/><author><name>Roger Farrés</name><uri>http://www.blogger.com/profile/10573664081029568895</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/__kltecQQkPA/SzNDuCd_OEI/AAAAAAAAABE/9k_aXK1wP0Q/S220/DSC_0014.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5802880096398782912.post-1000863322789415584</id><published>2008-10-01T15:55:00.002+02:00</published><updated>2008-10-01T16:15:06.990+02:00</updated><title type='text'>XBAP, WCF, NET 3.5 y Security Exception</title><content type='html'>Este post no contiene ninguna explicación técnica ni viene acompañado de código. El motivo es porque sólo pretendo explicaros un tema que me ha hecho perder muchas horas, y sinceramente espero que si alguien se encuentra en mi misma situación y lee este post, se pueda ahorrar el tiempo que he invertido yo mismo en encontrar el por qué. &lt;br /&gt;Un escenario muy común en aplicaciones XBAP que acceden a recursos externos ubicados en el servidor, está formado por la aplicación XBAP y un servicio WCF en el otro extremo que alimenta de recursos la aplicación. Al trabajar en entorno Internet y por consiguiente en Partial Trust, estamos obligados a publicar el servicio WCF en la misma URL de donde nos hemos descargado la aplicación XBAP. Si esto no se cumple, la aplicación lanza una excepción de seguridad y es incapaz de obtener ningún resultado. &lt;br /&gt;En mi caso particular, el entorno de desarrollo es un VS2008 y NET 3.5 SP1. La aplicación XBAP se publica desde este entorno, y trabajando en entorno local, las llamadas al servicio WCF responden sin ningún problema. Al pasar al entorno Internet, la aplicación empieza a dar problemas de seguridad (Security Exception), deduciendo que tengo problemas en direccionar las peticiones al servicio. Después de batallar un montón de horas, debugando y resiguiendo procesos, no encuentro ningún error que me pueda guiar a resolver el problema. Cuando entro en la fase de probar ya las cosas sin sentido, llega un punto que instalo en las máquinas cliente el SP1 del NET 3.5 y cuál es mi sorpresa que veo que la aplicación empieza a funcionar sin ningún tipo de problema. &lt;br /&gt;No me he parado a comprobar si publicando la aplicación desde una máquina sin SP1 hubiera funcionado (lo dudo), pero en cualquier caso ya sabéis, instalad el SP1 para evitaros problemas.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5802880096398782912-1000863322789415584?l=recursosdotnet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://recursosdotnet.blogspot.com/feeds/1000863322789415584/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5802880096398782912&amp;postID=1000863322789415584' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5802880096398782912/posts/default/1000863322789415584'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5802880096398782912/posts/default/1000863322789415584'/><link rel='alternate' type='text/html' href='http://recursosdotnet.blogspot.com/2008/10/xbap-wcf-net-35-y-security-exception.html' title='XBAP, WCF, NET 3.5 y Security Exception'/><author><name>Roger Farrés</name><uri>http://www.blogger.com/profile/10573664081029568895</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/__kltecQQkPA/SzNDuCd_OEI/AAAAAAAAABE/9k_aXK1wP0Q/S220/DSC_0014.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5802880096398782912.post-1277835285108388273</id><published>2008-09-03T08:02:00.013+02:00</published><updated>2008-09-03T08:37:45.917+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF ItemsPanel ListBox'/><title type='text'>Como obtener una instancia del ItemsPanel en un ItmesControl (ListBox por extensión)</title><content type='html'>Un problema común que me he encontrado recientemente, es como acceder en tiempo de ejecución, al ItemTemplate, ItemsPanel o al ItemsSource de un ItemControl (ListBox a partir de ahora para entendernos mejor).&lt;br /&gt;Para no liarnos, recordemos que el ItemsPanel es la definición del Panel que contiene los elementos (items) del ListBox, y que el ItemTemplate es la definición del layout de cada uno de estos items.&lt;br /&gt;Existe información de como acceder al ItemTemplate y poder modificarlo en tiempo de ejecución, pero es dificil encontrar como acceder al ItemsPanel. &lt;br /&gt;En mi caso necesitaba acceder porque queria aplicar un efecto fishPanel a los items de un ListBox. Una vez se mostraban los elementos necesitaba acceder a las propiedades del fishPanel para poder efectuar el movimiento de manera correcta.&lt;br /&gt;Bueno, a lo que vamos, os paso el código (en parte de Microsoft) para poder acceder al ItemsPanel de un ListBox ... muy útil, de verdad.&lt;br /&gt;&lt;span style="font-size:75%;"&gt;&lt;br /&gt;public static class getInstanceOfItemsPanelTemplate {&lt;br /&gt;&amp;nbsp;&amp;nbsp;public static Panel FindPanelFor(ItemsControl lstBox) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return FindPanelForInternal(lstBox);&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;private static Panel FindPanelForInternal(DependencyObject item) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (int i = 0; i &lt; VisualTreeHelper.GetChildrenCount(item); i++) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Panel iPanel = VisualTreeHelper.GetChild(item, i) as Panel;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (iPanel != null &amp;&amp; iPanel.IsItemsHost == true)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return iPanel;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Panel iRes = FindPanelForInternal(VisualTreeHelper.GetChild(item, i));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (iRes != null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return iRes;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return null;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5802880096398782912-1277835285108388273?l=recursosdotnet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://recursosdotnet.blogspot.com/feeds/1277835285108388273/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5802880096398782912&amp;postID=1277835285108388273' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5802880096398782912/posts/default/1277835285108388273'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5802880096398782912/posts/default/1277835285108388273'/><link rel='alternate' type='text/html' href='http://recursosdotnet.blogspot.com/2008/09/como-obtener-una-instancia-del.html' title='Como obtener una instancia del ItemsPanel en un ItmesControl (ListBox por extensión)'/><author><name>Roger Farrés</name><uri>http://www.blogger.com/profile/10573664081029568895</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/__kltecQQkPA/SzNDuCd_OEI/AAAAAAAAABE/9k_aXK1wP0Q/S220/DSC_0014.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5802880096398782912.post-520241391232946871</id><published>2008-06-29T17:06:00.015+02:00</published><updated>2008-06-29T19:11:59.172+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF Datatemplate Trigger'/><title type='text'>Triggers en los DataTemplates</title><content type='html'>Como ya sabemos, el templating de controles es muy potente en WPF, y un consejo que os doy es que lo utiliceis tanto como podáis, ya que nos permite mucha flexibilidad en la capa de presentación. El objetivo del post no es hablar del Templating, pero si a alguien le interesa mucho el tema o quiere profundizar, os paso un link a un &lt;a href="http://www.beacosta.com/"&gt;blog&lt;/a&gt; muy bueno sobre el binding y el templating, y además con ejemplos muy buenos.&lt;br /&gt;Un problema común que nos podemos encontrar, ocurre cuando estamos estilando por ejemplo un listbox y definimos un template para los items (ItemTemplate). Si queremos actuar sobre los elementos del Template en base a Triggers, se nos presenta un problema, ya que para hacerlo, tenemos que acceder al Ancestor a través del binding (es decir al listboxItem).&lt;br /&gt;Os paso código de como definir los triggers. El ejemplo hace referencia a mouseOver e IsSelected del ListBoxItem, y al dispararse el trigger realiza distintas operaciones en el tamaño con los elementos definidos en el Template.&lt;br /&gt;&lt;span style="font-size:75%;"&gt;&lt;br /&gt;&amp;#60;DataTemplate x:Key="DataTemplateListBox"&amp;#62;&lt;br /&gt;&amp;#60;ItemsControl d:IsGroup="True" Width="{xxx}" Height="{xxx}" Canvas.Left="0" Canvas.Top="0" HorizontalAlignment="Center" VerticalAlignment="Center"&amp;#62;&lt;br /&gt;&amp;#60;Grid x:Name="grdMn" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="{xxx}" Height="{xxx}" RenderTransformOrigin="0,0" Margin="0,0,0,0"&amp;#62;&lt;br /&gt;&amp;#60;r:openFormCanvas Width="{xxx}" Height="{xxx}" Name="canvasItem" Cursor="Hand" Background="{xxx}"  DataContext="{Binding Path=formControls}" Margin="0,0,0,0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" RenderTransformOrigin="0,0" &amp;#62;&lt;br /&gt;&amp;#60;r:openFormCanvas.RenderTransform&amp;#62;&lt;br /&gt;&amp;#60;TransformGroup&amp;#62;&lt;br /&gt;&amp;#60;ScaleTransform ScaleX="{xxx}" ScaleY="{xxx}"/&amp;#62;&lt;br /&gt;&amp;#60;/TransformGroup&amp;#62;&lt;br /&gt;&amp;#60;/r:openFormCanvas.RenderTransform&amp;#62;&lt;br /&gt;&amp;#60;/r:openFormCanvas&amp;#62;&lt;br /&gt;&amp;#60;Border x:Name="brdMn" BorderThickness="3,3,3,3" CornerRadius="2,2,2,2" BorderBrush="{xxx}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0,0,0,0" /&amp;#62;&lt;br /&gt;&amp;#60;/Grid&amp;#62;&lt;br /&gt;&amp;#60;/ItemsControl&amp;#62;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Como veis, el Template simplemente consta de un Canvas y un Border (para no molestar si hacéis un copy/paste, he renombrado los recursos a xxx). El canvas se llama canvasItem, el border brdMn y el Grid que los contiene grdMn. Seguimos ... vamos a definir los triggers...os marco en negrita lo importante ....&lt;br /&gt;&lt;span style="font-size:75%;"&gt;&lt;br /&gt;&amp;#60;DataTemplate.Triggers&amp;#62;&lt;br /&gt;&amp;#60;DataTrigger Binding="&lt;b&gt;{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}, AncestorLevel=1}, Path=IsMouseOver}&lt;/b&gt;" Value="True"&amp;#62;&lt;br /&gt;&amp;#60;Setter Property="RenderTransform" TargetName="canvasItem"&amp;#62;&lt;br /&gt;&amp;#60;Setter.Value&amp;#62;&lt;br /&gt;&amp;#60;ScaleTransform ScaleX="{xxx}" ScaleY="{xxx}"/&amp;#62;&lt;br /&gt;&amp;#60;/Setter.Value&amp;#62;&lt;br /&gt;&amp;#60;/Setter&amp;#62;&lt;br /&gt;&amp;#60;Setter Property="Width" TargetName="grdMn" Value="{xxx}"/&amp;#62;&lt;br /&gt;&amp;#60;Setter Property="Height" TargetName="grdMn" Value="{xxx}"/&amp;#62;&lt;br /&gt;&amp;#60;/DataTrigger&amp;#62;&lt;br /&gt;&amp;#60;DataTrigger Binding="&lt;b&gt;{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}, AncestorLevel=1}, Path=IsSelected}&lt;/b&gt;" Value="True"&amp;#62;&lt;br /&gt;&amp;#60;Setter Property="RenderTransform" TargetName="canvasItem"&amp;#62;&lt;br /&gt;&amp;#60;Setter.Value&amp;#62;&lt;br /&gt;&amp;#60;ScaleTransform ScaleX="{xxx}" ScaleY="{xxx}"/&amp;#62;&lt;br /&gt;&amp;#60;/Setter.Value&amp;#62;&lt;br /&gt;&amp;#60;/Setter&amp;#62;&lt;br /&gt;&amp;#60;Setter Property="Width" TargetName="grdMn" Value="{xxx}"/&amp;#62;&lt;br /&gt;&amp;#60;Setter Property="Height" TargetName="grdMn" Value="{xxx}"/&amp;#62;&lt;br /&gt;&amp;#60;/DataTrigger&amp;#62;&lt;br /&gt;&amp;#60;/DataTemplate.Triggers&amp;#62;&lt;br /&gt;&amp;#60;/DataTemplate&amp;#62;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Como podeis ver, si se produce un mouseOver sobre el ListBoxItem, se escalan los elementos del template en base a valores definidos en recursos. Lo mismo si el ListBoxItem está seleccionado.&lt;br /&gt;Esto es todo. Espero os pueda ayudar&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5802880096398782912-520241391232946871?l=recursosdotnet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://recursosdotnet.blogspot.com/feeds/520241391232946871/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5802880096398782912&amp;postID=520241391232946871' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5802880096398782912/posts/default/520241391232946871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5802880096398782912/posts/default/520241391232946871'/><link rel='alternate' type='text/html' href='http://recursosdotnet.blogspot.com/2008/06/triggers-en-los-datatemplates.html' title='Triggers en los DataTemplates'/><author><name>Roger Farrés</name><uri>http://www.blogger.com/profile/10573664081029568895</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/__kltecQQkPA/SzNDuCd_OEI/AAAAAAAAABE/9k_aXK1wP0Q/S220/DSC_0014.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5802880096398782912.post-1167654446022760185</id><published>2008-06-20T21:25:00.003+02:00</published><updated>2008-06-20T21:42:31.749+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF XBAP browsed'/><title type='text'>XBAP y aplicaciones Standalone</title><content type='html'>De todos es conocida la posibilidad de poder ejecutar código NET como una aplicación convencional (standalone application), o ejecutar código sobre Internet Explorer (browsed applications o XBAP). En este post no pretendo hablar sobre los trusted levels enXBAP ni sobre click once, sólo pretendo mostraros un template para Visual Studio que és muy útil para poder desarrollar desde la misma solución, código para las dos plataformas. Con este template, no tendreis que crear los dos tipus de soluciones e ir alternando código.&lt;br /&gt;Os paso el &lt;a href="http://scorbs.com/2006/06/04/vs-template-flexible-application/"&gt;link&lt;/a&gt; donde lo podeis descargar y encontrar más información si os gusta el tema.&lt;br /&gt;Para utilizarlo, teneis que descargaros el zip y copiarlo en la carpeta de los templates que teneis en Mis Documentos + VS2008 + Templates + Project Templates + Visual c#. Una vez copiado, al crear un nuevo proyecto, al seleccionar el Lenguaje ya podreis ver el Template Flexible application.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5802880096398782912-1167654446022760185?l=recursosdotnet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://recursosdotnet.blogspot.com/feeds/1167654446022760185/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5802880096398782912&amp;postID=1167654446022760185' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5802880096398782912/posts/default/1167654446022760185'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5802880096398782912/posts/default/1167654446022760185'/><link rel='alternate' type='text/html' href='http://recursosdotnet.blogspot.com/2008/06/xbap-y-aplicaciones-standalone.html' title='XBAP y aplicaciones Standalone'/><author><name>Roger Farrés</name><uri>http://www.blogger.com/profile/10573664081029568895</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/__kltecQQkPA/SzNDuCd_OEI/AAAAAAAAABE/9k_aXK1wP0Q/S220/DSC_0014.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5802880096398782912.post-1482614935158904289</id><published>2008-06-12T22:45:00.009+02:00</published><updated>2008-06-20T21:57:40.702+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WCF WPF Binding endpoint no config'/><title type='text'>Cliente WCF sin archivo de configuración</title><content type='html'>... y para empezar el blog, un caso típico que nos ha pasado alguna vez o al menos, seguro nos hemos preguntado el por qué al empezar a trabajar con servicios WCF.&lt;br /&gt;Desde Visual Studio, al crear un nuevo servicio WCF, automáticamente se nos crea un archivo de configuración con la definición de los endpoints y los bindings. A partir de estos datos de configuración externos, podemos acceder sin problemas a nuestro servicio recién creado, y podemos ajustar la configuración para crear nuevos endpoints o simplemente retocar la configuración por defecto.&lt;br /&gt;Hasta ahí ningún problema, pero si queremos prescindir del archivo de configuración porque el proxy reside en un ensamblado externo o simplemente porque queremos prescindir de él, tenemos que crear la configuración mediante código.&lt;br /&gt;Aqui os paso código que define el Binding. Los valores configurados son los de un cliente web service estandard sin nigún tipo de seguridad establecida y valores por defecto. El Binding resultante hay que informarlo al proxy generado por el mismo Visual Studio.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;BasicHttpBinding binding = new BasicHttpBinding();&lt;br /&gt;TimeSpan span01 = new TimeSpan( 0, 3, 0 );&lt;br /&gt;TimeSpan span10 = new TimeSpan(0, 10, 0);&lt;br /&gt;TimeSpan span100 = new TimeSpan(0, 100, 0);&lt;br /&gt;binding.Name = "NoConfigBinding";&lt;br /&gt;binding.CloseTimeout = span01;&lt;br /&gt;binding.OpenTimeout = span10;&lt;br /&gt;binding.ReceiveTimeout = span100;&lt;br /&gt;binding.SendTimeout = span10;&lt;br /&gt;binding.AllowCookies = false;&lt;br /&gt;binding.BypassProxyOnLocal = false;&lt;br /&gt;binding.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard;&lt;br /&gt;binding.MaxBufferSize = 5242880;&lt;br /&gt;binding.MaxBufferPoolSize = 5242880;&lt;br /&gt;binding.MaxReceivedMessageSize = 5242880;&lt;br /&gt;binding.MessageEncoding = WSMessageEncoding.Text;&lt;br /&gt;binding.TextEncoding = Encoding.UTF8;&lt;br /&gt;binding.TransferMode = TransferMode.Buffered;&lt;br /&gt;binding.UseDefaultWebProxy = true;&lt;br /&gt;binding.ReaderQuotas = new XmlDictionaryReaderQuotas();&lt;br /&gt;binding.ReaderQuotas.MaxDepth = 32;&lt;br /&gt;binding.ReaderQuotas.MaxStringContentLength = 5242880;&lt;br /&gt;binding.ReaderQuotas.MaxArrayLength = 5242880;&lt;br /&gt;binding.ReaderQuotas.MaxBytesPerRead = 5242880;&lt;br /&gt;binding.ReaderQuotas.MaxNameTableCharCount = 16384;&lt;br /&gt;binding.Security.Mode = BasicHttpSecurityMode.None;&lt;br /&gt;binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None;&lt;br /&gt;binding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.None;&lt;br /&gt;binding.Security.Transport.Realm = string.Empty;&lt;br /&gt;binding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.UserName;&lt;br /&gt;binding.Security.Message.AlgorithmSuite = SecurityAlgorithmSuite.Default;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5802880096398782912-1482614935158904289?l=recursosdotnet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://recursosdotnet.blogspot.com/feeds/1482614935158904289/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5802880096398782912&amp;postID=1482614935158904289' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5802880096398782912/posts/default/1482614935158904289'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5802880096398782912/posts/default/1482614935158904289'/><link rel='alternate' type='text/html' href='http://recursosdotnet.blogspot.com/2008/06/cliente-wcf-sin-archivo-de-configuracin.html' title='Cliente WCF sin archivo de configuración'/><author><name>Roger Farrés</name><uri>http://www.blogger.com/profile/10573664081029568895</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/__kltecQQkPA/SzNDuCd_OEI/AAAAAAAAABE/9k_aXK1wP0Q/S220/DSC_0014.jpg'/></author><thr:total>0</thr:total></entry></feed>
