Archiv

Artikel Tagged ‘Tutorial’

Get Starting – einige nützliche Links

8. September 2010 juergen79 Keine Kommentare

Neben den wie auch schon aus den anderen Versionen schon üblich war gibt es unter Silverlight.net bleibt auch in der Version 4 die erste Anlaufstelle, um sich mit Silverlight zu beschäftigen “Get Started” auf der Plattform.

Aber neben den üblichen Web-Applikationen und der seit Silverlight 3 möglichen Out-of-Browser-Applikation kann man nun mit Silverlight auch für das Windows Phone 7 Applikationen entwicklen, dazu hat Tim Heuer eine Serie gestartet “Getting Started with Silverlight and Windows Phone 7 Development“.

Zusätzlich gibt es auf Channel 9 noch einen Silverlight Training Course (Silverlight 4).

Business Apps Example for Silverlight 3 RTM and .NET RIA Serie Update

30. Dezember 2009 juergen79 Keine Kommentare

Es ist ein weiterer Teil der Serie von Brad Abrams verfügbar sowie Kommentare und eine Zusammenfassung:

Getting Start: Silverlight Entwicklung

30. Dezember 2009 juergen79 Keine Kommentare

Tim Heuer hat sich entschlossen eine Tutorial-Reihe als Einführung in die Silverlightentwicklung zu schreiben, welche es Einsteiger erleichtern sollte sich mit der Entwicklung von Silverlight-Applikationen.

  1. Part 1: Really getting started
    Die Tools:
  2. Part 2: Defining UI Layout – Verstehen von des UI Layouts und Navigation
  3. Part 3: Accessing data – wie man auf Daten zugreift
    • Web Services: SOAP, ASP.NET web services (ASMX), WCF Services, POS, REST Endpunkte
    • Sockets: Network Socket Kommunikation
    • File: Zugriff auf statischen Content via Webrequest
  4. Part 4: Binding the data – wie man die erhaltenen Daten auch verwenden kann
  5. Part 5: Integrating additional controls – einbinden von Controlelement die nicht Teil des Standards sind
  6. Part 6: Polishing the UI with styles and templates
  7. Part 7: Taking the application out-of-browser

The Silverlight Geek Mini-Tutorials

27. Dezember 2009 juergen79 Keine Kommentare

Wie jeder weiß gibt es vom Silverlight Geek Jesse Liberty jede Menge Tutorials neben den 10 Full-Tutorials hat er auch die sogenannten Mini-Tutorials:

Tutorial: .NET RIA Service – LINQ to Bing

20. Dezember 2009 juergen79 Keine Kommentare

Im letzten Post haben wir schon über das API gesprochen, um mittels LINQ auf Bing Suchergebnisse zugreifen zu können. In diesem Tutorial werden wir über .NET RIA Service Integration. Das IQuerable und das LINQ-Pattern sind grundlegendes des .NET RIA Service, welches den Entwicklern erlaubt übergreifend über Client und Server auf Daten zugreifen zu können.

Normalerweise verwendet man Bing für eine Rich Internet Application auf eine Art: Man macht Client-seitig einen Anfrage an Bing durch den Server oder direkt vom Client, unter der Verwendung einer Cross-Domain Networking API, wie sie von Silverlight zur Verfügung gestellt wird.

Für Demonstrationzwecke reicht eine einfach und minimalistische Applikation. Es reicht eine Search TextBox und einige Panels um die Ergebnisse anzuzeigen gemeinsam mit dem Paging UI. Das UI kann man für beide Möglichkeiten der Abfragen verwenden.

Zugriff auf Bing durch einen Server Proxy
Als erstes die Suchanfrage unter der Verwendung von LINQ to Bing API mit einem DomainService, welches auf dem Server läuften und das reguläre .NET RIA Service tooling um einen DomainContext am Client zu generieren.
Hier eine einfache grundlegende DomainService Klasse, welche die Suchfunktionalität abkapselt:

[EnableClientAccess]
<span style="color: rgb(0, 0, 255);">public</span> <span style="color: rgb(0, 0, 255);">class</span> SearchService : DomainService {

    <span style="color: rgb(0, 0, 255);">private</span> BingContext CreateContext() {
        <span style="color: rgb(0, 0, 255);">string</span> appKey = ConfigurationManager.AppSettings[<span style="color: rgb(0, 96, 128);">"BingAppKey"</span>];
        <span style="color: rgb(0, 0, 255);">return</span> <span style="color: rgb(0, 0, 255);">new</span> BingContext(appKey);
    }

    <span style="color: rgb(0, 0, 255);">public</span> IQueryable<ImageSearchResult> SearchImages(<span style="color: rgb(0, 0, 255);">string</span> query) {
        BingContext context = CreateContext();
        <span style="color: rgb(0, 0, 255);">return</span> <span style="color: rgb(0, 0, 255);">from</span> i <span style="color: rgb(0, 0, 255);">in</span> context.Images.SafeResults()
               <span style="color: rgb(0, 0, 255);">where</span> i.Query == query
               <span style="color: rgb(0, 0, 255);">select</span> i;
    }

    <span style="color: rgb(0, 0, 255);">public</span> IQueryable<PageSearchResult> SearchPages(<span style="color: rgb(0, 0, 255);">string</span> query) {
        BingContext context = CreateContext();
        <span style="color: rgb(0, 0, 255);">return</span> <span style="color: rgb(0, 0, 255);">from</span> p <span style="color: rgb(0, 0, 255);">in</span> context.Pages.SafeResults()
               <span style="color: rgb(0, 0, 255);">where</span> p.Query == query
               <span style="color: rgb(0, 0, 255);">select</span> p;
    }
}

Einige interessante Beabachtungen:

  • SearchService leiten sich direkt vom DomainService ab. Es macht keinen Unterschied, ob man traditionelle Daten Abstraktions Schichten (DAL), wie LINQ to SQL oder Entity Framework verwendet. Das Domain Service Pattern beschreibt keine bestimmt DAL. Wir haben eine fundamentalen architektonischen Grundsatz, um nicht eine bestimmte Datenzugrifftechnologie zu erfinden.
  • Man kann die BLinq API direkt vom DomainService heraus verwenden.
  • Die Query-Methode gibt ein IQueryable eher als eine Liste von Resultaten zurück. Das erlaubt weitere Query-Kompositionen durch den Aufrufers. Die Skip/Take ermöglicht es dem Client Seitenwechsel durchzuführen, es wird über den Server verbunden und vom BingQueryProvider des Bing Service die letztendliche Query in eine URI übersetzt.
  • Man kann natürlich auch zusätzlcihe Query Methoden einführen, welche zum Beispiel weitere Parameter übernehmen oder eine Serverseitige Caching ausführen oder Daten von mehereren Quellen von Daten verarbeiten oder die Daten vom Server filtern, usw. Die Werte des Domainservice erhält man und muss sie im Code plazieren. Man kann machen, was immer Sinn für die Applikation macht.

Wenn man das beachtet erhält man den folgend Code:

<span style="color: rgb(0, 0, 255);">public</span> <span style="color: rgb(0, 0, 255);">sealed</span> <span style="color: rgb(0, 0, 255);">partial</span> <span style="color: rgb(0, 0, 255);">class</span> ImageSearchResult : Entity {<br />    ...<br />}<br /><br /><span style="color: rgb(0, 0, 255);">public</span> <span style="color: rgb(0, 0, 255);">sealed</span> <span style="color: rgb(0, 0, 255);">partial</span> <span style="color: rgb(0, 0, 255);">class</span> PageSearchResult : Entity {<br />    ...<br />}<br /><br /><span style="color: rgb(0, 0, 255);">public</span> <span style="color: rgb(0, 0, 255);">sealed</span> <span style="color: rgb(0, 0, 255);">partial</span> <span style="color: rgb(0, 0, 255);">class</span> SearchContext : DomainContext {<br /><br />    <span style="color: rgb(0, 0, 255);">public</span> SearchContext() : <br />        <span style="color: rgb(0, 0, 255);">this</span>(<span style="color: rgb(0, 0, 255);">new</span> HttpDomainClient(<span style="color: rgb(0, 0, 255);">new</span> Uri(<span style="color: rgb(0, 96, 128);">"DataService.axd/SearchApp-Services-SearchService/"</span>,<br />                                          System.UriKind.Relative))) {<br />    }<br /><br />    <span style="color: rgb(0, 0, 255);">public</span> EntityList<ImageSearchResult> ImageSearchResults {<br />        get { ... }<br />    }<br />        <br />    <span style="color: rgb(0, 0, 255);">public</span> EntityList<PageSearchResult> PageSearchResults {<br />        get { ... }<br />    }<br />        <br />    <span style="color: rgb(0, 0, 255);">public</span> EntityQuery<ImageSearchResult> SearchImagesQuery(<span style="color: rgb(0, 0, 255);">string</span> query) {<br />        ...<br />    }<br />        <br />    <span style="color: rgb(0, 0, 255);">public</span> EntityQuery<PageSearchResult> SearchPagesQuery(<span style="color: rgb(0, 0, 255);">string</span> query) {<br />        ...<br />    }<br />}<br />

Man kann auch folgenden Code-Behind schreiben:

<span style="color: rgb(0, 0, 255);">private</span> <span style="color: rgb(0, 0, 255);">void</span> LoadData() {<br />    SearchContext context = <span style="color: rgb(0, 0, 255);">new</span> SearchContext();<br />    pagesList.ItemsSource = context.PageSearchResults;<br /><br />    EntityQuery<PageSearchResults> query =<br />        context.SearchPagesQuery(<span style="color: rgb(0, 96, 128);">"nikhil"</span>);<br />    context.Load(query);<br />}<br />

In der Applikation ist es sinnvoll die DomainDataSourc Control zu verwenden. Das deklarative Datenquellen Modell ist gut, wenn man nicht eine zusätzliche Logik auf der Präsentationschicht haben möchte. Es behandelt UI Parameterveränderungen, ladet die Daten asyncron, verwaltet das Laden der Daten usw.

<span style="color: rgb(0, 0, 255);"><</span><span style="color: rgb(128, 0, 0);">TextBox</span> <span style="color: rgb(255, 0, 0);">Grid</span>.<span style="color: rgb(255, 0, 0);">Row</span><span style="color: rgb(0, 0, 255);">="2"</span> <span style="color: rgb(255, 0, 0);">x:Name</span><span style="color: rgb(0, 0, 255);">="searchTextBox"</span> <span style="color: rgb(0, 0, 255);">/></span><br /><br /><span style="color: rgb(0, 0, 255);"><</span><span style="color: rgb(128, 0, 0);">ria:DomainDataSource</span> <span style="color: rgb(255, 0, 0);">x:Name</span><span style="color: rgb(0, 0, 255);">="pagesDataSource"</span><br />  <span style="color: rgb(255, 0, 0);">DomainContext</span><span style="color: rgb(0, 0, 255);">="{StaticResource searchContext}"</span><br />  <span style="color: rgb(255, 0, 0);">QueryName</span><span style="color: rgb(0, 0, 255);">="SearchPagesQuery"</span><span style="color: rgb(0, 0, 255);">></span><br />  <span style="color: rgb(0, 0, 255);"><</span><span style="color: rgb(128, 0, 0);">ria:DomainDataSource.QueryParameters</span><span style="color: rgb(0, 0, 255);">></span><br />    <span style="color: rgb(0, 0, 255);"><</span><span style="color: rgb(128, 0, 0);">riadata:ControlParameter</span> <span style="color: rgb(255, 0, 0);">ParameterName</span><span style="color: rgb(0, 0, 255);">="query"</span><br />      <span style="color: rgb(255, 0, 0);">ControlName</span><span style="color: rgb(0, 0, 255);">="searchTextBox"</span> <span style="color: rgb(255, 0, 0);">RefreshEventName</span><span style="color: rgb(0, 0, 255);">="TextChanged"</span> <span style="color: rgb(0, 0, 255);">/></span><br />  <span style="color: rgb(0, 0, 255);"></</span><span style="color: rgb(128, 0, 0);">ria:DomainDataSource.QueryParameters</span><span style="color: rgb(0, 0, 255);">></span><br /><span style="color: rgb(0, 0, 255);"></</span><span style="color: rgb(128, 0, 0);">ria:DomainDataSource</span><span style="color: rgb(0, 0, 255);">></span><br /><br /><span style="color: rgb(0, 0, 255);"><</span><span style="color: rgb(128, 0, 0);">ItemsControl</span> <span style="color: rgb(255, 0, 0);">x:Name</span><span style="color: rgb(0, 0, 255);">="pagesList"</span> <span style="color: rgb(255, 0, 0);">ItemsSource</span><span style="color: rgb(0, 0, 255);">="{Binding ElementName=pagesDataSource, Path=Data}"</span><span style="color: rgb(0, 0, 255);">></span><br />  <span style="color: rgb(0, 0, 255);"><</span><span style="color: rgb(128, 0, 0);">ItemsControl.ItemTemplate</span><span style="color: rgb(0, 0, 255);">></span><br />    <span style="color: rgb(0, 0, 255);"><</span><span style="color: rgb(128, 0, 0);">DataTemplate</span><span style="color: rgb(0, 0, 255);">></span><br />      <span style="color: rgb(0, 0, 255);"><</span><span style="color: rgb(128, 0, 0);">StackPanel</span><span style="color: rgb(0, 0, 255);">></span><br />        <span style="color: rgb(0, 0, 255);"><</span><span style="color: rgb(128, 0, 0);">HyperlinkButton</span> <span style="color: rgb(255, 0, 0);">Content</span><span style="color: rgb(0, 0, 255);">="{Binding Title}"</span> <span style="color: rgb(255, 0, 0);">NavigateUri</span><span style="color: rgb(0, 0, 255);">="{Binding Uri}"</span> <span style="color: rgb(255, 0, 0);">TargetName</span><span style="color: rgb(0, 0, 255);">="_blank"</span> <span style="color: rgb(0, 0, 255);">/></span><br />        <span style="color: rgb(0, 0, 255);"><</span><span style="color: rgb(128, 0, 0);">TextBlock</span> <span style="color: rgb(255, 0, 0);">Text</span><span style="color: rgb(0, 0, 255);">="{Binding Description}"</span> <span style="color: rgb(0, 0, 255);">/></span><br />        <span style="color: rgb(0, 0, 255);"><</span><span style="color: rgb(128, 0, 0);">TextBlock</span> <span style="color: rgb(255, 0, 0);">Text</span><span style="color: rgb(0, 0, 255);">="{Binding DisplayUrl}"</span> <span style="color: rgb(0, 0, 255);">/></span><br />      <span style="color: rgb(0, 0, 255);"></</span><span style="color: rgb(128, 0, 0);">StackPanel</span><span style="color: rgb(0, 0, 255);">></span><br />    <span style="color: rgb(0, 0, 255);"></</span><span style="color: rgb(128, 0, 0);">DataTemplate</span><span style="color: rgb(0, 0, 255);">></span><br />  <span style="color: rgb(0, 0, 255);"></</span><span style="color: rgb(128, 0, 0);">ItemsControl.ItemTemplate</span><span style="color: rgb(0, 0, 255);">></span><br /><span style="color: rgb(0, 0, 255);"></</span><span style="color: rgb(128, 0, 0);">ItemsControl</span><span style="color: rgb(0, 0, 255);"></span>

Jedes Mal wenn der Text in der Search TextBox sich ändert, formuliert die DataSource einen EntityQuery und gibt es an den SearchContext weiter, um die Ergebnisse zu laden. Die Ergebnisse werden an das ItemsControl abgegeben. Die meist identisch dem Codesnippet ist welcher auf imperative Variante geschrieben wird.


Das Diagramm zeigt die unterschiedlichen Schichten bei der Verwendung der Server-side proxing. Die grauen Boxen, z.B. das Web Service und das korrespondierende HttpDomainClient, sind Rohrleitungen. Die Webservice Box ist verantwortlich für die Freigabe der Applikationslogik während der DomainContext für das Bereitstellen der Daten durch das Arbeiten mit dem verbundenen DomainClient in der restlichen Applikation verantwortlich ist.

Zugriff auf Bing direkt vom Client
Es kann in vielen Fällen notwendig sein, dass ein Service nicht den Cross-Domain-Zugriff unterstützt oder dass das Service auf heikel Daten zugreift, welche nicht an den Client ausgeliefert werden soll. Bing ist auch ein sinnvoller Kanditat für den direkten Zugriff vom Client aus.

Während man beim serverseitigen Proxy die Anfragen an Bing direkt aus dem Silverlight Code gestartet wird verwendet man EntityList, EntityQuery und DomainContext-basierende Programmiermodelle am Client. Dafür ist es notwendig eine BingDomainContext Klasse der Silverlight Version von BLinq zu implementieren und einen BingDomainClient welcher die Logik für die Erstellung von Bing API Anfragen abkapselt.

<span style="color: rgb(0, 0, 255);">public</span> <span style="color: rgb(0, 0, 255);">class</span> SearchContext : BingDomainContext {<br /><br />    <span style="color: rgb(0, 0, 255);">public</span> SearchContext()<br />        : <span style="color: rgb(0, 0, 255);">base</span>(appKey) {<br />    }<br />}<br />

BingDomainContext aus dem BLinq Framework hat folgende OM:

<span style="color: rgb(0, 0, 255);">public</span> <span style="color: rgb(0, 0, 255);">abstract</span> <span style="color: rgb(0, 0, 255);">class</span> BingDomainContext : DomainContext {<br /><br />    <span style="color: rgb(0, 0, 255);">protected</span> BingDomainContext(BingDomainClient domainClient)<br />        : <span style="color: rgb(0, 0, 255);">base</span>(domainClient) {<br />    }<br /><br />    <span style="color: rgb(0, 0, 255);">protected</span> BingDomainContext(<span style="color: rgb(0, 0, 255);">string</span> appKey)<br />        : <span style="color: rgb(0, 0, 255);">this</span>(<span style="color: rgb(0, 0, 255);">new</span> BingDomainClient(appKey)) {<br />    }<br /><br />    <span style="color: rgb(0, 0, 255);">public</span> EntityList<ImageSearchResult> ImageSearchResults {<br />        get { ... }<br />    }<br /><br />    <span style="color: rgb(0, 0, 255);">public</span> EntityList<PageSearchResult> PageSearchResults {<br />        get { ... }<br />    }<br /><br />    <span style="color: rgb(0, 0, 255);">public</span> EntityQuery<ImageSearchResult> SearchImagesQuery(<span style="color: rgb(0, 0, 255);">string</span> query) {<br />        ...<br />    }<br /><br />    <span style="color: rgb(0, 128, 0);">// Other image query methods...</span><br /><br />    <span style="color: rgb(0, 0, 255);">public</span> EntityQuery<PageSearchResult> SearchPagesQuery(<span style="color: rgb(0, 0, 255);">string</span> query) {<br />        ...<br />    }<br /><br />    <span style="color: rgb(0, 128, 0);">// Other page query methods...</span><br />}<br />

Beobachtungen:

  • SearchContext wird von BingDomainContext abgeleitet, welches ein identisches Set von EntityLists und Query-Methoden wie vorhin in dem vorigen Ansatz.
  • BingDomainContext verwendet den BingDomainClient anstelle des HttpDomainClient, der Defaultmässig angezeigt wird. BingDomainClient kapselt die Logik um mit Bing API zu arbeiten und fügt es unter die DomainContext. Das voher gezeigt Model ist intakt nur die Networkkommunikations Ebene wurde komplet weggelassen.

Die öffentliche Oberfläche und das Programmiermodell werden durch SearchContext beansprucht, welches BingDomainContext/BingDomainClient verwendet. Die restliche Applikation bleibt komplett unverändert. Die DataDomainSource weiß überhaupt nicht, dass die Network-Ebene verändert wurde. Die DataPager Controls verwenden die Skip/Take Expressions  gleich wie zuvor und bekommt sie in Bing Such-URI übersetzt, dieses mal vom Client. Das folgende Korrespodenz-Diagramm zeigt wie der Client aufgebaut ist ohne eine serverseitigen Gegenstücke, typisch für .NET RIA Services Applikationen.

Es zeigt, wie einfach es ist Bing in eine Silverlight Applikation mit .NET RIA Services einzubinden, trotzdem mit der Ansteuerung unter der Verwendung Serverseitige Proxing oder direkten Clientzugriff. Das Framework und die Beispielapplikationen sind verfügbar. Zuvor sollte man aber die Bing Developer Seite besuchen und sich einen Applikationskey holen um einzufügen, damit der Code auch ausgeführt werden kann. Man braucht auch die aktuellste CTP des .NET RIA Services.

Einige technische Details des DomainClient…
Im Post von Nikhil Kothari’s “ViewModel + .NET RIA Services Part 2: Testability, Server Mocking and Dependencies” die Dehnbarkeit des DomainClient das Unit-testing clientseitig via MockDomainClient, welches eine In-Memory Speicherung eher als einen Aufruf eines Service, beschriebt. In diesem Post ist es wichtig, dass der DomainClient ein generelles Proxy für ein Service repräsentiert welches die API als Set von Query Operations, SumbitChanges Operationen und einem Set von Invoke Operationen abstraktiert.

Man kann vom DomainClient ableiten und es unterhalb eines DomainContext hinzufügen, um die Low-Level Details des Service zu übernehmen während das höhere-Level Programmiermodell intakt bleibt. Es ist zu empfehlen den Code zu überprüfen, wenn man sein eigenes Service oder back-end hinzufügen will.

Tutorial: .NET RIA Services – Bing Search APIs

18. Dezember 2009 juergen79 Keine Kommentare

Mit LINQ kann man für die Suche nach Webseiten und Bilder die Bing-Search-API verwenden.

Bing hat eine Search-API, welche ein REST Interface (XML oder JSON) oder ein SOAP Interface bereitstellt. LINQ bietet mehrere natürliche LINQ Syntax, dann braucht man sich keine Sorgen machen über die Protokolldetails, Webrequest, URIs usw.. Unter der LINQ-Funktionalität  baut es auf einer REST/XML API.

Hier ein Beispiel für die Grundsuche von seiten unter der Verwendung von BLinq:

BingContext bing = <span style="color: rgb(0, 0, 255);">new</span> BingContext(appKey);
IQueryable<PageSearchResult> pagesQuery =
    <span style="color: rgb(0, 0, 255);">from</span> p <span style="color: rgb(0, 0, 255);">in</span> bing.Pages
    <span style="color: rgb(0, 0, 255);">where</span> p.Query == <span style="color: rgb(0, 96, 128);">"lacrosse"</span>
    <span style="color: rgb(0, 0, 255);">select</span> p;
<span style="color: rgb(0, 0, 255);">foreach</span> (PageSearchResult page <span style="color: rgb(0, 0, 255);">in</span> pagesQuery) {
    <span style="color: rgb(0, 128, 0);">// Write out page members (title, uri, description, display URL and date)</span>
}

BingContext ist sehr ähnlich dem Linq-to-SQL DataContext. Es hat eine Seiteneigenschaft von IQueryable . Da es sich um LINQ handelt kann man natürlich die Standard LINQ Konstrukte wie Skip und Take verwenden, um durch die Seiten zu blättern.

<span style="color: rgb(0, 128, 0);">// Get the first search result...</span><br />pagesQuery = pagesQuery.Take(1);<br />

BLinq stellt aber auch laufend Interface bereit um eine oder mehrere zusätzliche Optionen zu konfigurieren wenn eine Suchanfrage gestartet wurde. Zum Beispiel ich suche nach einem Restaurant in Graz:

IQueryable<PageSearchResult> pagesQuery =<br />    <span style="color: rgb(0, 0, 255);">from</span> p <span style="color: rgb(0, 0, 255);">in</span> bing.Pages.LocalResults(<span style="color: rgb(0, 96, 128);">"Graz"</span>)<br />    <span style="color: rgb(0, 0, 255);">where</span> p.Query == <span style="color: rgb(0, 96, 128);">"restaurant"</span><br />    <span style="color: rgb(0, 0, 255);">select</span> p;<br />

Andere Optionen um Ergebnisse einer Seite abzugrenzen, wenn man z.B. Silverlight relevanten Inhalt einer Seite will:

IQueryable<PageSearchResult> pagesQuery =<br />    <span style="color: rgb(0, 0, 255);">from</span> p <span style="color: rgb(0, 0, 255);">in</span> bing.Pages.ScopeResults(<span style="color: rgb(0, 96, 128);">"ebnerj.at/blog"</span>)<br />    <span style="color: rgb(0, 0, 255);">where</span> p.Query == "silverlight"<br />    <span style="color: rgb(0, 0, 255);">select</span> p;<br />

Das waren einige Beispiele für Seitensuche. BLinq unterstützt auch die Suche nach Bildern. Wenn man Bilder vom Grand Canyon will:

IQueryable<ImageSearchResult> imagesQuery =<br />    <span style="color: rgb(0, 0, 255);">from</span> img <span style="color: rgb(0, 0, 255);">in</span> bing.Images.SafeResults()<br />    <span style="color: rgb(0, 0, 255);">where</span> img.Query == <span style="color: rgb(0, 96, 128);">"Grand Canyon"</span><br />    <span style="color: rgb(0, 0, 255);">select</span> img;<br /><span style="color: rgb(0, 0, 255);">var</span> imagesPage1 = imagesQuery.Take(10).ToList();<br /><span style="color: rgb(0, 0, 255);">var</span> imagesPage2 = imagesQuery.Skip(10).Take(10).ToList();<br /><span style="color: rgb(0, 0, 255);">foreach</span> (ImageSearchResult img <span style="color: rgb(0, 0, 255);">in</span> imagesPage1.Union(imagesPage2)) {<br />    <span style="color: rgb(0, 128, 0);">// Write out image title, image URI, image size, containing page URI,</span><br />    <span style="color: rgb(0, 128, 0);">// thumbnail URI, and thumbnail size.</span><br />}<br />

Zusammenfassend gesagt, BLinq arbeitet wie jeder LINQ-Provider für den Satz der Ressourcen welche der darunterliegenden API. Der Code sieht nicht nur gleich konsistent wie anderer LINQ Code sondern funktioniert auch mit Standardtools für LINQ, wie z.B. LINQPad Tool.

Um einen Überblick über die LINQ-Expressions zu bekommen kann empfiehlt es sich die Bücher “LINQ Programming” von Joe Mayo oder “LINQ in Action” von F. Marguerie, S. Eichert und J. Wooley von Manning Pubn zu werfen.

Das ist erst der Start. Es gibt noch viele Möglichkeiten, wie Searching nach Rechtschreibung, relevante Suche, Anzeigen, usw.der Bing API. Ein Beispiel-Framework für LINQ Funktionalitäten gibt es bei Nikhilk.net. Wie auch bei Flickr benötigt man für die Verwendung des Service einen registrierten API key.

Tutorial: HD YouTube Videos abspielen

18. Dezember 2009 juergen79 Keine Kommentare

Mit Silverlight 3 lassen sich HD YouTube Videos ganz einfach abspielen, Silverlight 3 das H.264-Format unterstützt und deshalb kann man YouTube direkt aus eine Silverlight Applikation heraus abspielen.

Wie geht es?

  1. Als erstes sucht man die URL des gewünschten Videos in HD-Format raus. YouTube bietet jedes Video in verschiedenen Formate an, aber für das Video wird das HD MP4 Format verwendet.
  2. Es gibt mehrere Möglichkeiten, wie man die URL für das HD-Video bekommt. Man kann Greasemonke (Firfox Plugin) oder das YouTube HD Ultimate script verwenden. Die Grundidee ist es das diese Skripte es einem erlauben, die Videos in verschiedenen Formaten downzuloaden (auch das HD MP4).

  3. Das Video ist ausgewählt und die URL
    http://www.youtube.com/watch?v=guzJTsJ_dec (NCAA D1 Lacrosse Harvard vs Duke 2009)
  4. Als nächstes braucht man nur die URL als eine Quelle für das MediaElement setzen.
  5. Der XAML-Code für die Referenz:
    <MediaElement HorizontalAlignment="Left"
    VerticalAlignment="Top"
    Source="http://www.youtube.com/watch?v=guzJTsJ_dec
    "/>
  6. Man kann aber auch statt dem MediaElement the kompleten MediaPlayer Control verwenden. Man findet ihn unter Assets-Panel im Expression Blend.
  7. Einfach im Design plazieren und die Soure setzen.
  8. Im Properties-/Eigenschaften-Tab ist die Playliste zu finden und klick auf New (Button) und man kann die Playlist hinzufügen. Man kann auch PlaylistItem mit der Items(Collection)browse(…)button
  9. Der XAML Code schaut in etwa so aus:
    <ExpressionMediaPlayer:MediaPlayer >
    <ExpressionMediaPlayer:MediaPlayer.Playlist>
    <ExpressionMediaPlayer:Playlist>
    <ExpressionMediaPlayer:Playlist.Items>
    <ExpressionMediaPlayer:PlaylistItem
    MediaSource="
    http://www.youtube.com/watch?v=guzJTsJ_dec
    </ExpressionMediaPlayer:Playlist.Items>
    </ExpressionMediaPlayer:Playlist>
    </ExpressionMediaPlayer:MediaPlayer.Playlist>
    </ExpressionMediaPlayer:MediaPlayer>
  10. Man kann die Applikation nun starten und das video abspielen.

Mehr Infos zum MedisPlayer gibt es auf dem Blog von Adam Kinny beim Eintrag “MediaPlayer control included Silverlight 3


Business Apps Example for Silverlight 3 RTM and .NET RIA Serie Update

1. Oktober 2009 juergen79 Keine Kommentare

Element Binding

8. August 2009 juergen79 Keine Kommentare

In Silverlight 3 kann man ein User Interface Element als ein Binding Objekt für andere verwenden. Dadurch kann man seinen Code vereinfachen.

Was ist es?
Mit Element Binding ist es möglich den Wert eines Objektes in einem UI direkt zu einem zweiten Objekt binden ohne Rückgriff auf das Daten Objekt oder Handling Events.

Wie kann ich das?
Das zeigt Jesse Liberty in seinem Mini-Tutorial – Element Binding.

Weitere Mini-Tutorials gibt es auf Silverlight.net.

Business Apps Example for Silverlight 3 RTM and .NET RIA Serie

8. August 2009 juergen79 Keine Kommentare