Vem är Johan Lindfors

Jag jobbar som teknisk chef på Microsoft i Sverige och ansvarar för vår tekniska evangelisering mot utvecklare. I den här bloggen har jag för avsikt att skriva om utveckling i allmänhet och på Microsofts plattform i synnerhet.


Get Microsoft Silverlight

Bygg dynamiska webbplatser med ASP.nET

Det tynger mig att erkänna att ibland (och ännu värre oftare och oftare) så hänger inte ens jag med i svängen av olika projekt som publiceras från utvecklingsteamen på huvudkontoret. Det senaste som jag precis blev varse om är så kallade “Free Web Application Toolkits”. Det är en samling komponenter, eller kanske mer beskrivande byggstenar som du kan använda i dina webbaplikationer för att enkelt skapa dynamiska lösningar utan att behöva skapa det mest fundamentala själv.

Redan nu finns följande byggstenar:

  • “Freemium”
    Med hjälp av det här ramverket kan du enkelt skapa en “gratis” version av din tjänst för att på så sätt locka till dig kunder för dina premium tjänster.
  • Calendars
    Som namnet antyder kan du med det här ramverket enkelt konsumera och exponera kalender funktionalitet i dina lösningar.
  • Bing Maps
    Jepp, du gissade det, kartor är en vanlig komponent i flertalet applikationer idag, här kommer du igång snabbt!
  • Internet Explorer 8
    Här har det samlats tekniker för att snabbt exponera Web Slices, acceleratorer och sökfunktionalitet som IE8 kan konsumera och erbjuda en starkare relation till dina kunder.
  • Bing Search
    Med hjälp av detta ramverk kan du snabbt komma igång med att använda Bing som interaktiv sökmetod från dina lösningar.
  • REST Services
    Att exponera mer och mer data och tjänster med hjälp av REST spås bli framtiden för morgondagens applikationer på webben, och med hjälp av det här ramverket är det enkelt att lägga till det som behövs till dina applikationer för att skapa ett standardiserat sätt att hämta informationen från dina tjänster.
  • Mobile Web Applications
    Det här ramverket visar och demonstrerar hur du kan vidareutveckla en befintlig ASP.NET MVC applikation till att erbjuda sin funktionalitet till mobila enheter, oavsett enhet och plattform.
  • Template-Driven Email
    Nyhetsbrev är absolut inte dött, utan ses fortfarande som ett bra sätt att kontinuerligt göra sina användare, kunder och partners uppmärksamma på händelser och uppdateringar på sina tjänster. Här kommer du igång snabbt!
  • Making Your Website Social
    Det här ramverket visar hur du kan integrera sociala tjänster som exempelvis messenger i din applikation för att ytterligare stärka relationen med användarna.
  • FAQ’s
    Fler och fler applikationer har behovet av att visa en lista med de vanligaste frågorna (och svaren) från sidan. Här är en uppsättning tekniker för att bidra med den funktionaliteten.
Postades 19. februari 2010 12:54 av Johan Lindfors

Köra .NET applikation och databas från USB

Fick en fråga för ett par dagar sedan om det fanns något trevligt sätt att köra en .NET applikation från en USB-sticka utan att den behövs installeras, och samtidigt kunna jobba mot någon sorts datakälla utan att kräva en databas på datorn.

Ett alternativ är att använda sig av SQL Server Compact 3.5 som databas. SQL Server Compact är en kompakt (jepp du anade det) version av SQL Server som inte kräver en serverinstans eller exekverande databas för att kunna hämta och lagra data. En direktlänk för att ladda hem SQL Server Compact har du här!

Det går till och med att använda Entity Framework eller LINQ to SQL mot SQL Server Compact men det finns en del saker att tänka på, jag vill varmt rekommendera att ladda hem SQL Server Compact Books Online som innehåller både dokumentation och exempel som hjälper dig igång.

Observera dock att “klienten” där applikationen är avsedd att köras på (från USB-sticka) behöver ha dll-filerna för SQL Server Compact installerade, vilket också är ett moment som kräver administrativa rättigheter på datorn. Jag har inte provat att packa med DLL’erna lokalt på USB’n och referera dem där, men det kanske kan fungera.

Ett annat alternativ (till SQL Server Compact) är naturligtvis att använda en XML-fil som datakälla och sedan DataSet i applikationen, det finns tack och lov LINQ to DataSet Smile 

Har du andra förslag som du vill dela med dig av? Hör av dig!

Postades 27. januari 2010 21:03 av Johan Lindfors
Taggar:

Använda Azure för att lagra och publicera media

I och med att Silverlight Streaming är på väg att fasas ut så har David Sayed satt samman en serie blogginlägg som beskriver hur Windows Azure kan användas för liknande lösningar.

Alan Smith som är MVP i Sverige har redan byggt en sådan lösning och den kan du hitta på www.cloudcasts.net. Den används för att publicera instruktionsfilmer och intervjuer för det mesta runt .NET.

Postades 12. januari 2010 17:15 av Johan Lindfors
Taggar: ,

MVC på mobilen, en TODO-lista

imageI den förra postningen om MVC på mobilen så introducerade jag ett MVC-ramverk utvecklat av Alex Yakhnin på Microsoft. Här tänkte jag fortsätta utvärdera ramverket genom att göra lite mera nytta än bara visa ett formulär. Den här gången kommer jag att skapa en TODO-lista som kommer att se ut som formuläret till höger. Interaktionen är på det sättet att användaren skriver text i textrutan högst upp och kan välja att antingen trycka enter eller helt enkelt välja Add-knappen för att lägga till texten som en uppgift i listan. Senare kommer jag att lägga till interaktion för att ta bort uppgifter och kanske till och med hantera prioriteringar.

Jag kan utgå från den förra artikelns resultat och helt enkelt lägga till tre kontroller på formuläret (och ta bort den befintliga “labeln”):

  • En TextBox med namnet txtTodoToAdd
  • En knapp med namnet btnAdd
  • En ListBox med namnet lstTodos

Jag byter också namn på formuläret till att heta TodosView samt sätter texten på formuläret att vara “TODO”. För att vara lite förebyggande så kommer jag att använda ett Repository för att hantera uppgifter så jag skapar helt enkelt ett interface enligt följande:

public interface ITodoRepository
{
    IEnumerable<string> GetAll();
    void Add(string task);
}

Jag skulle naturligtvis kunna använda en databas eller annat persistent lagringskälla, men nu vill jag fokusera på ytan så jag implementerar ITodoRepository i ett “fake”-objekt enligt följande:

public class TodoRepositoryFake : ITodoRepository
{
    private List<string> _todos = null;

    public TodoRepositoryFake()
    {
        _todos = new List<string>
        {
            "Buy milk",
            "Pick up kids"
        };
    }

    public IEnumerable<string> GetAll()
    {
        return _todos.AsEnumerable();
    }

    public void Add(string todo)
    {
        _todos.Add(todo);
    }
}

Jag ser också till att registrera detta repository i min ApplicationManager-klass enligt följande:

private static void Initialize()
{
    container = new Container();

    container.Register<ITodoRepository>(c => new TodoRepositoryFake());
...

Nu har jag kommit till att skapa min riktiga “controller”, den får heta TodosController och kommer att ärva från den generiska basklassen Controller<IEnumerable<string>> för att ge indikation på att vi kommer att skicka en samling av strängar som primär källa för data till vyn. Det ger nämligen att fältet this.View.ViewData.Model kommer att starkt typas till att vara just IEnumerable<string>.

public class TodosController : Controller<IEnumerable<string>>
{
    ITodoRepository _repository = null;

    public TodosController(IView<IEnumerable<string>> view) : base(view) { }
   
    public Container Container { get; set; }

    private void OnExit(object sender, EventArgs e)
    {
        Application.Exit();
    }
}

Det första jag vill ska hända när controllern laddas är att den instansierar mitt repository och hämtar alla uppgifter samt skickar dessa till vyn. En metod som lämpar sig för detta ändamål är OnInitialize-metoden som kan hittas på basklassen Controller. Därför implementerar jag metoden enligt följande:

protected override void OnInitialize(params object[] parameters)
{
    _repository = this.Container.Resolve<ITodoRepository>();
    this.view.ViewData.Model = _repository.GetAll();
}

Men hur får jag då min vy att förstå att jag har laddat och populerat ViewData.Model med data? Jo, helt enkelt genom att skicka en händelse till vyn och berätta detta. Därför skapar jag en EventHandler och publicerar den till vyn på samma sätt som jag i förra artikeln publicerade en händelse från vyn till controllern.

[PublishEvent("OnTodosLoaded")]
public event EventHandler TodosLoadedEvent; 

Sedan måste jag “trigga” den händelsen och det görs vanligtvis med följande kodrader:

if (TodosLoadedEvent != null)
{
    TodosLoadedEvent(this, EventArgs.Empty);
}

Just det mönstret är något som jag har kommit att använda ofta när jag använder det här ramverket därför har jag skapat några “extensions-methods” som underlättar anropet lite (mina extension-methods kan du hitta sist i den här artikeln), koden blir då som följer istället:

this.RaiseEvent(TodosLoadedEvent, EventArgs.Empty);

Så den slutliga koden på OnInitialize blir som följer:

[PublishEvent("OnTodosLoaded")]
public event EventHandler TodosLoadedEvent;

protected override void OnInitialize(params object[] parameters)
{
    _repository = this.Container.Resolve<ITodoRepository>();
    this.view.ViewData.Model = _repository.GetAll();

    this.RaiseEvent(TodosLoadedEvent, EventArgs.Empty);
}

Nu vill jag också skapa logiken i vyn för att hantera uppgifter samt lyssna på händelsen att repositoryt har laddat uppgifterna. Min vy som alltså heter TodosView ärver från ViewForm samt implementerar också interfacet IView<IEnumerable<string>>, som precis som på controllern gör att ViewData.Model starkt typas till det som jag vill använda mig av. Koden som följer har också redan implementerat händelsen för att avsluta applikationen precis som den tidigare artikeln:

public partial class TodosView : ViewForm, IView<IEnumerable<string>>
{
    [PublishEvent("OnExit")]
    public event EventHandler OnExitEvent;

    public TodosView()
    {
        InitializeComponent();
    }

    #region IView<IEnumerable<TodoTask>> Members

    public new IEnumerable<string> Model { get; set; }

    public new ViewDataDictionary<IEnumerable<string>> ViewData { get; set; }

    #endregion

    private void menuExit_Click(object sender, EventArgs e)
    {
        this.RaiseEvent(OnExitEvent, EventArgs.Empty);
    }
}

Sedan vill jag lägga till logiken för att visa de laddade uppgifterna i listan på vyn:

private void OnTodosLoaded(object sender, EventArgs e)
{
    this.listTodos.Items.Clear();
    foreach (var item in this.ViewData.Model)
    {
        this.listTodos.Items.Add(item);
    }
    this.listTodos.Refresh();
} 

Den ovanståend metoden kommer alltså av ramverket kopplas som en metod som anropas när controllern triggar händelsen OnTodosLoaded som publiceras med attributet [Publish(…)] i controllern. Så långt fungerar applikationen som den ska men jag vill också ha logiken för att kunna lägga till nya uppgifter så jag kopplar händelse-hanterare till händelsen KeyDown på txtTodoToAdd och till händelsen Click på btnAdd. Koden skriver jag som nedan:

[PublishEvent("OnTodoAdded")]
public event EventHandler<DataEventArgs<string>> OnTodoAddedEvent;

private void txtTaskToAdd_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        this.RaiseEvent(OnTodoAddedEvent, 
            new DataEventArgs<string>(txtTaskToAdd.Text));
        txtTaskToAdd.Text = "";
    }
}

private void btnAdd_Click(object sender, EventArgs e)
{
    this.RaiseEvent(OnTodoAddedEvent, 
        new DataEventArgs<string>(txtTaskToAdd.Text));
    txtTaskToAdd.Text = "";
}

Observera att jag också har skapat ytterligare en publicerad händelse som kallas OnTodoAdded som notifierar kontrollern att jag har lagt till en ny uppgift. När jag triggar den händelsen i båda hanterarna så skickar jag också med en sträng som beskriver den nya händelsen. Det är också därför som den generiska EventHandlern har typ-defintionen: EventHandler<DataEventArgs<string>> OnTodoAddedEvent. DataEventArgs<T> kommer från System.Mobile.Mvc-namnrymden.

Sista delen i applikationen blir att i controllern hantera tillägget av en ny uppgift, spara i repositoryt och sedan notifiera vyn om att samlingen är uppdaterad. Följande metod läggs till i controllern, och det naturligtvis viktigt att metoden heter det som det publicerade attributet specificerat i vyn:

private void OnTodoAdded(object sender, DataEventArgs<string> e)
{
    _repository.Add(e.Value);
    this.view.ViewData.Model = _repository.GetAll();
    this.RaiseEvent(TodosLoadedEvent, EventArgs.Empty);
}

Jag gör det ganska enkelt för mig genom att helt enkelt lägga till uppgiften som skickas med hjälp av DataEventArgs<T>-parametern e i repositoryt och sedan ladda alla uppgifter på nytt innan jag notifierar vyn på samma sätt som tidigare att datat har uppdaterats.

Nu måste jag bara uppdatera ApplicationManager att registrera vyn och controllern innan jag kör applikationen. Här är den uppdaterade initialiserings-koden:

private static void Initialize()
{
    container = new Container();

    container.Register<ITodoRepository>(c => new TodoRepositoryFake());

    container.Register<TodosView>(c => new TodosView());
    container.Register<TodosController>(
        c => new TodosController(
            c.Resolve<TodosView>())).InitializedBy(
            (c, v) => v.Container = c);

    Navigator.SetControllerProvider(new ControllerProvider(container));
}

Och i Main-metoden uppdaterar jag koden att bli följande:

public static void Start()
{
    var todosController = container.Resolve<TodosController>();
    todosController.Initialize();
    Application.Run(todosController.View as Form);
}

Prova att köra!

Mina extension-methods:

Här följer fyra metoder som kan användas för att notifera vyer och controllers att det ar hänt något som bör trigga händelser i respektive:

public static class MyExtensions
{
    public static void RaiseEvent(
        this ViewForm form, 
        EventHandler theEvent, 
        EventArgs e)
    {
        if (theEvent != null)
        {
            theEvent(form, e);
        }
    }

    public static void RaiseEvent<TEventArgs>(
        this ViewForm form, 
        EventHandler<TEventArgs> theEvent, 
        TEventArgs e) 
            where TEventArgs : EventArgs
    {
        if (theEvent != null)
        {
            theEvent(form, e);
        }
    }

    public static void RaiseEvent(
        this Controller form, 
        EventHandler theEvent, 
        EventArgs e)
    {
        if (theEvent != null)
        {
            theEvent(form, e);
        }
    }

    public static void RaiseEvent<TEventArgs>(
        this Controller form, 
        EventHandler<TEventArgs> theEvent, 
        TEventArgs e) 
            where TEventArgs : EventArgs
    {
        if (theEvent != null)
        {
            theEvent(form, e);
        }
    }
}

Kom gärna med kommentarer!

Postades 25. december 2009 20:26 av Johan Lindfors
Taggar: ,

HUR utveckla GPS-lösningar med hjälp av emulator

image Om du vill utveckla en applikation som använder sig av GPS men inte har tillgång till en fysisk enhet för test så kan du fortfarande använda emulatorn för detta ändamål. I SDK’t till Windows Mobile 6 följer nämligen med en liten trevlig applikation som heter FakeGPS. Den finns i min installation i “C:\Program Files\Windows Mobile 6 SDK\Tools\FakeGPS” och har en .CAB fil som installeras på emulatorn. När den installerade applikationen startar så kommer den att simulera att en fysisk GPS finns tillgänglig. Den fungerar på det sättet att den läser en text med GPS-strängar som du naturligtvis kan modifiera för att passa den plats som du vill testa på.

Mer information om FakeGPS och annat som introducerades i WM6 finns att läsa här!

Postades 24. december 2009 08:37 av Johan Lindfors
Taggar:

MVC på mobilen

Jag har ända sedan ASP.NET MVC annonserades intresserat mig för det mönstret och försökt att läsa på så mycket det bara gått. Jag antar att jag borde ha sett nyttan och skönheten långt tidigare, men det har hela tiden funnits andra tekniker att också intressera sig för.

Det som jag också noterade under en workshop på Mobil Business konferensen var att hela utvecklingsmodellen för applikationer på iPhone var baserade på samma mönster. Då tänkte jag så klart att vi vill inte vara sämre på Windows Phone så först började jag skissa själv på en sådan implementation, men kom samtidigt på att det finns flera implementationer på Windows-sidan, sedan tidigare som borde vara lätta att migrera. Därför började jag istället söka lite och stötte omedelbart på ett ramverk som heter Mobile MVC och som naturligtvis finns publicerat på CodePlex. Det har jag därför börjat att läsa på lite om och lyckats att skapa lite roliga exempel på användning.

Här är en introduktion till Mobile MVC:

image Jag börjar med att skapa ett nytt projekt för Windows Mobile med 6.5 som SDK och alltså .NET Compact Framework 3.5 som “runtime”. Efter det så lägger jag till referenser till System.Mobile.Mvc.dll och Microsoft.Practices.Mobile.ContainerModel.dll, båda dessa kan fås genom att ladda hem Mobile MVC från CodePlex. Jag skapar också en projektstruktur med lite mappar för att få ordning på de filer vi snart ska skriva och resultatet kan ses här till höger!

Det jag sedan också vill lägga till direkt är möjligheten för lite mer löst kopplade klasser och därför använda Dependency Injection, därför lägger jag till två stycken klasser som kan hittas i exempelkoden till Mobile MVC, men här följer dessa filers kod, den första filen heter helt enkelt ControllerProvider.cs och används för att instansiera mina controllers framöver.

public class ControllerProvider : IControllerProvider
{
    private Container container;
    
    public ControllerProvider(Container container)
    {
        this.container = container;
    }       
   
    #region IControllerProvider Members

    public Controller GetController(string name)
    {
        throw new NotImplementedException();
    }

    public Controller GetController(Type type)
    {
        throw new NotImplementedException();
    }

    public Controller GetController<T>()
    {
        return this.container.Resolve<T>() as Controller;           
    }

    public Controller GetController<T>(IView view)
    {
        Controller controller = this.container.Resolve<Controller>();
        controller.View = view;
        return controller;
    }

    public void RegisterController(Controller controller)
    {
        throw new NotImplementedException();
    }

    #endregion
}

Den andra filen heter ApplicationManager.cs och används för att konfigurera upp den ControllerProvider som tidigare skrevs. Här är koden för den filen:

public class ApplicationManager
{
    private static Container container;

    static ApplicationManager()
    {
        Initialize();
    }

    private static void Initialize()
    {
        container = new Container();

        // TODO add registration here

        Navigator.SetControllerProvider(new ControllerProvider(container));         
    }

    public static void Start()
    {
        // TODO add initialization here
    }
}

Som synes så finns det lite kvar att lägga till innan applikationen kommer att fungera, men det kommer vi till snart.

Nu börjar vi att lägga till en controller, förslagsvis i mappen Controllers. Den får heta MainController och har för avsikt att visa en vy och sedan låta användaren helt enkelt terminera applikationen vid ett sådan menyval i vyn. Vi kommer inte ens att jobba med data utan bara introducera koncepten i mvc-mönstret för mobilen. Hela controllern ser ut så här:

public class MainController : Controller
{
    public MainController(IView view): base(view) { }

    public Container Container { get; set; }

    private void OnExit(object sender, EventArgs e)
    {
        Application.Exit();
    }
}

Klassen ärver av Controller-basklassen och konstruktorn tar som synes emot en vy som kopplas till controllern. Sedan finns det en lokal variabel för containern som används för att hitta andra klasser och tjänster med dependency injection-mönstret. Den sista metoden OnExit kommer att användas för att vyn ska kunna kommunicera med controllern på löst kopplade sätt. Det är den metoden som avslutar applikationen.

imageLåt mig sedan lägga till vår enda vy, smakfullt kallas den MainView och är helt enkelt ett vanligt Formulär för Windows Mobile.

Jag gör två förändringar på formuläret i design-läge, det ena är att lägga till en label med lite text som gör applikationen till vad den är och det andra är att lägga till ett menyalternativ för att kunna avsluta applikationen, detta meny-alternativ får heta menuExit och så här ser mitt formulär ut. Jag genererar också en event-handler för menuExit.Click händelsen.

Sedan byter jag till kodläge och uppdaterar koden till att se ut som följer:

public partial class MainView : ViewForm
{
    [PublishEvent("OnExit")]
    public event EventHandler OnExitEvent;

    public MainView()
    {
        InitializeComponent();
    }

    private void menuExit_Click(object sender, EventArgs e)
    {
        if (OnExitEvent != null)
        {
            this.OnExitEvent(this, EventArgs.Empty);
        }
    }
}

Även här ärver jag från en ny klass och i det här fallet så heter basklassen ViewForm, observera gärna att det ändå inte påverkar design-läget utan jag kan fortsätta att jobba med den visuella designern för kontroller och element på vyn.

Attributet [PublishEvent(“OnExit”)] låter controllern få reda på att en händelse har uppstått i vyn när den händelsen triggas och det som jag sedan gör i menuExit_Click är först att kontrollera om det finns någon “prenumerant” på händelsen och i sådant fall se till att anropa den prenumeranten.

Nu behöver jag bara registrera alla komponenter i containern och se till att starta applikationen. Registreringen sker i ApplicationManager enligt följande kod:

private static void Initialize()
{
    container = new Container();

    container.Register<MainView>(c => new MainView());
    container.Register<MainController>(
        c => new MainController(
            c.Resolve<MainView>())).InitializedBy(
            (c, v) => v.Container = c);

    Navigator.SetControllerProvider(new ControllerProvider(container));         
}

I samma fil lägger jag också till initaliseringskoden för att starta applikationen:

public static void Start()
{
    var mainController = container.Resolve<MainController>();
    mainController.Initialize();
    Application.Run(mainController.View as Form);
}

Det sista som behövs är att se till att starta hela härligheten i Program-klassens Main-metod enligt följande lilla rad:

ApplicationManager.Start();

imageSedan kör jag applikationen och hör och häpna, ett formulär öppnar sig och när jag väljer meny-alternativet Exit så avslutas den.

Det här var som sagt bara en introduktion till MVC-mönstret på Windows Mobile, nu börjar det roliga, att hämta data, koppla data från modeller till kontroller i vyer, kommunicera mellan kontroller till vyer och andra kontroller, navigera fram och tillbaka och massa annat gott som jag får försöka att skriva om framöver på svenska. Men kan du inte hålla dig utan redan nu vill lära dig mer och läsa om vad Alex har skapat med sitt ramverk så finns det ytterligare artiklar på engelska på hans blogg:

  1. Mobile MVC Framework (part 1)
  2. Mobile MVC Framework (part 2)
  3. Mobile MVC Framework (part 3) – communicating with events
  4. Mobile MVC Framework (part 4) – passing data between controllers
  5. Mobile MVC Framework – Update with Dependency Injection
Postades 22. december 2009 15:14 av Johan Lindfors
Taggar: ,

Hur använda en anpassad emulator för Windows Phone

Så här kan du göra för att använda den anpassade HTC HD2-konfigurationen som jag har laddat upp för jul-tävlingen!

Ladda hem och zippa upp katalogen till en lämplig plats som du lätt kan komma åt. Öppna sedan Visual Studio 2008 och gå till menyn “Tools” | “Options”. Där väljer du sedan fliken “Device Tools” och “Form Factors”.

image Välj att utgå från en redan befintlig form-faktor genom att välja aktuellt SDK och sedan den typ av enhet som är närmast. För HTC HD2 så är “Windows Mobile 6 Professional” att föredra eftersom den har skärmförhållanden som passar för det här ändamålet. Spara den profilen som en ny profil och döp den förslagsvis till “HTC HD2”. Öppna sedan dess egenskaper och byt ut dess “skin” till den .xml-fil som du nyss packade upp från min anpassning.

Här kan du nu också själv bestämma om du vill direkt jobba i 192 DPI och upplösningen 480x800 eller som jag föredrar att använda 96 DPI och 240x400.

imageNär du är klar med konfigurationen så bör du i Visual Studio nu kunna på ett formulär i ett Smart Device-projekt kunna ange att form-faktorn ska vara HTC HD2.

För att få iordning på emulatorn så är stegen nästan likadana. Gå till “Tools” | “Options” och sedan till fliken “Device Tools” men nu till “Devices”. Skapa på samma sätt som ovan en ny profil, använd gärna “USA Windows Mobile 6.5 Professional WVGA Emulator” som utgångspunkt. Spara profilen som “HTC HD2” och öppna åter egenskaperna. Välj sedan knappen “Emulator Options” och fliken “Display”. Där kan du åter peka ut den .xml-konfiguration som användes tidigare och helt plötsligt har du en emulator som ser ut som en HTC HD2-enhet. Jag väljer också att sätta den nya profilen till “Default Device”.

Observera att du behöver ha Windows Mobile 6.5 Developer Toolkit för att kunna göra anpassningen enligt ovan, men det anar jag att du redan har nu :)

Postades 22. december 2009 10:23 av Johan Lindfors

Min och din mobila jul

Julen närmar sig med stormsteg och det tänker jag fira med att utlysa en liten eminent tävling här på programmeramera.se. Jag har fått loss lite priser som jag avser att ge bort till de utvecklare som bygger de roligaste och häftigaste mobil-applikationerna för HTC HD2 under julen, fram till den 10:e januari.

Här är tävlingens priser (och som vanligt betalas eventuell vinstskatt av vinnaren):

  1. image HTC HD2 telefon! Jepp, en riktig!
  2. En exklusiv Crumpler-väska med msdn-tryck!
  3. Skruvmejselkit för datorpillande :) (5 vinnare)

För att göra tävlingen lite smalare så är det meningen att du utvecklar för just HTC HD2 och det innebär lite sköna “begränsningar”. Enheten har GPS, accelerometer, ljussensor, störtbra touch-skärm, 480x800 i upplösning, 3G/GPRS/EDGS/WiFi, kamera på 5 megapixel, Bluetooth och massa andra coola saker som du kan använda i applikationen.

image image För att göra utvecklingen lite enklare och roligare så har jag skapat en emulator- och design-konfiguration som gör att det känns lite trevligare att bygga i Visual Studio när miljön smakar som en HTC HD2.

Det borde underlätta lite för att se hur applikationen som du skriver kommer att se ut på den riktiga enheten. Jag har dessvärre inte konfigurerat knapparna att agera som de borde göra, men det är kanske inte heller ett måste om du ska utveckla en touch-applikation.

Det endra kravet som jag ställer för att du ska få vara med i tävlingen är att du accepterar att din applikation ska vid eventuell första-plats vinst (HTC-HD2 telefonen) kunna publiceras på Marketplace.

Jag kommer själv att bygga lite applikationer under julen så eventuellt väljer jag att tävla själv också, men jag kommer inte att kunna vinna så klart :)

Bidrag skickas lämpligast till via kontaktformuläret på den här bloggen och alltså senast söndagen den 10:e januari 2010!

Jag kommer att värdera användning av funktioner i telefonen, snyggt och effektivt gränssnitt, coola ideér och väl genomförd utveckling som komponenter i totalbetyget för att vinna tävlingen!

För att komma igång så finns det en del resurser som jag tror kan hjälpa dig:

Postades 21. december 2009 14:34 av Johan Lindfors
Taggar:

Använd Exempeldata i SQL Azure

Nu finns det möjlighet att använda exempeldata från Microsofts Adventureworks exempel även i SQL Azure. Du kan redan nu hämta hem skripten som behövs från codeplex och publicera i molnet.

Kanske något som kan underlätta för att bygga en häftig tjänst i vår lokala “Windows Azure Developer Contest” som fortfarande tar emot bidrag.

Postades 16. december 2009 07:29 av Johan Lindfors
Taggar: ,

Hur Blingar jag min blogg?

Slängde ihop en liten Bling-widget för BlogEngine.NET, och det är verkligen löjligt enkelt. Resultatet kan ses här till höger imagei annonsen för Mix10. Jag skapade helt enkelt en ny underkatalog till katalogen “widgets” enligt bilden, där kan du också de andra filerna som skapades (klipptes och klistrades från en annan widget). De andra filerna är helt enkelt widget.ascx och edit.ascx med “code-behind”-filer i C#.

I mitt fall så ville jag helt enkelt ha en widget som visar en bild som kan hämtas från en annan plats och eventuellt också kunna länka den bilden till en annan sida på Internet, inga konstigheter alls.

Koden för widget.ascx i HTML blev följande:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="widget.ascx.cs" Inherits="widgets_Bling_widget" %>
<div class="Bling">
   <asp:HyperLink ID="aBling" runat="server">
        <asp:Image ID="imgBling" runat="server" />
   </asp:HyperLink>
</div>

Koden för widget.ascx.cs ser ut så här:

using System.Collections.Specialized;

public partial class widgets_Bling_widget : WidgetBase
{

    public override string Name
    {
        get { return "Bling"; }
    }

    public override bool IsEditable
    {
        get { return true; }
    }

    public override void LoadWidget()
    {
        LoadSettings();
    }
    
    private void LoadSettings()
    {
        StringDictionary settings = GetSettings();
        try
        {
            if (settings.ContainsKey("blingurl"))
                imgBling.ImageUrl = settings["blingurl"].ToString();

            if (settings.ContainsKey("blinglink"))
            {
                aBling.NavigateUrl = settings["blinglink"].ToString();
                aBling.Enabled = true;
            }
            else
            {
                aBling.Enabled = false;
            }
        }
        catch
        { }
    }
}

Koden för edit.ascx är helt enkelt:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="edit.ascx.cs" Inherits="widgets_Bling_edit" %>

<label for="<%=txtBlingUrl.ClientID %>">Bling Url</label><br />
<asp:TextBox runat="Server" ID="txtBlingUrl" />

<br /><br />

<label for="<%=txtBlingLink.ClientID %>">Navigates to:</label><br />
<asp:TextBox runat="Server" ID="txtBlingLink" />

Och koden för den bakomliggande koden i edit.ascx.cs är:

using System;
using System.Web.UI;
using System.Collections.Specialized;

public partial class widgets_Bling_edit : WidgetEditBase
{
    protected override void OnPreRender(EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            StringDictionary settings = GetSettings();

            if (settings.ContainsKey("blingurl"))
                txtBlingUrl.Text = settings["blingurl"];

            if (settings.ContainsKey("blinglink"))
                txtBlingLink.Text = settings["blinklink"];
            
        }
    }

    public override void Save()
    {
        StringDictionary settings = GetSettings();
        settings["blingurl"] = txtBlingUrl.Text;
        settings["blinglink"] = txtBlingLink.Text;
        SaveSettings(settings);

        Cache.Remove("bling");
    }
}

Enkel lösning på ett enkelt problem, jag har också möjligheten att använda CSS om det är så att jag vill göra något ytterligare i och med <div class=”Bling”></div> men det ser jag inget behov av just nu.

Postades 8. december 2009 21:02 av Johan Lindfors

Den här bloggen använder BlogEngine.NET 1.6.0.0
Temat anpassat av Johan Lindfors