Thursday, August 2, 2012

DarkSky Developer Contest - Dates & Prize Pool

,
So here we are, the good stuff. When do we have to be done and what the heck do we get if we win?

Dates

Start NOW, if you have not signed up please do so here. This is important, I need your valid email address so that I can get you the API developer key for Dark Sky.

Next, apps must be submitted in completion no later than 10/1/2012.  This give us time to review them, get them loaded on or devices etc.  If you publish them to the Marketplace please send me the links so that we can get them downloaded.  If they are paid applications, please send us the .xap or provide a download link so we may side load the applications.

So, prizes.  One grand prize for the best Windows 7 Phone and best Windows 8 Metro application. Each winning team or person will receive the following:

Dark Sky Umbrella
Click for larger image

  • DarkSky  Custom-printed senz˚ umbrellas — capable of withstanding 80 km/h winds
  • $49.99 XBOX Live Point Card
Also each completed application submitted will also receive a free copy of NetAdvantage for Windows Phone from Infragistics.

Other submissions will be awarded various prizes so get to coding!  We are excited to see what's in store.

Any questions please contact @spboyer 
Read more →

Getting started with Windows Phone and MVVM Light - Part 2 of 2

,

In Part 1, we covered the following:
  • Creating the application
  • Connecting the View and the View-Model
  • Adding an additional View or Page
Part 2 we'll see how to add a button on the first page to navigate to the second page which will cover navigation and messaging to complete the application and although basic, will give a rather decent start to create and publish your first Rubber Ducky application.

If you need the code, you can get it here.

Let’s start by opening MainPage.xaml.  You should see the following image here:


Add a button by dragging it on to the design surface or adding the following code, it doesn’t matter where, just somewhere within the content grid.


<TextBlock Text="{Binding Welcome}"
			           Style="{StaticResource PhoneTextNormalStyle}"
			           HorizontalAlignment="Center"
			           VerticalAlignment="Center"
			           FontSize="40" />
					   
            <Button Content="Button" 
					Height="72" HorizontalAlignment="Left" 
					Margin="154,354,0,0" Name="button1" 
					VerticalAlignment="Top" Width="160" />



Next, lets add the messaging capabilities which will work hand in hand with the navigation from one page to the next. Start by adding a new folder to the solution called “Messages”.


Then add a new class called NavigateToPageMessage.cs which contains the following code.


public class NavigateToPageMessage
{
	public NavigateToPageMessage()
	{

	}

	public string PageName { get; set; }
}

Now we have to register the main page of the application to receive the NavigateToPageMessage and do something once it receives it. Open MainPage.xaml and add a new event handler for the Loaded Event. Do this by selecting the PhoneApplicationPage in the Document Outline Window, go to the Properties Windows and select the Events Tab and double click the Loaded event to insert the code.

  image

 Open the MainPage.xaml.cs code and find the newly inserted event handler which should look like the following:

private void PhoneApplicationPage_Loaded(object sender, System.Windows.RoutedEventArgs e)
{
	
}

In order to support messaging from MVVM Light, add the messaging namespace (MvvmLight1.Messages;) to the top of the page. Next, we will add the code to subscribe to the NavigateToPageMessage.



private void PhoneApplicationPage_Loaded(object sender, System.Windows.RoutedEventArgs e)
{
	Messenger.Default.Register<NavigateToPageMessage>
				(
					this,
					(action) => ReceiveMessage(action)
				);
}

ReceiveMessage is the delegate that will handle the message object, in this case the NavigateToPageMessage type.

private object ReceiveMessage(NavigateToPageMessage action)
{
	var page = string.Format("/Views/{0}View.xaml", action.PageName);

	if (action.PageName == "Main")
	{
		page = "/MainPage.xaml";
	}


	NavigationService.Navigate(
	   new System.Uri(page,
			 System.UriKind.Relative));
	return null;
}

What we have done here is handled the property PageName of the action and to the application to navigate to the appropriate page. Pretty simple right?  You’ll notice that I put in a special handler here if the PageName is Main to follow the default structure in the MVVM Light template.  As a note, I typically move the MainPage into the Views folder and make the adjustments to all of the wiring so that all of my views are in the place where I like them.  Next step is to hook up that button we added earlier to send the NavigateToPageMessage when its clicked. If you have Blend, this portion is drag and drop, otherwise you’ll have to some cut and paste. Open the project in Blend, then open MainPage.xaml in the designer. Select the Assets Tab and click on the Behaviors in the left panel.  You will see a selection called EventToCommand; click and drag this item to either the Button on the design surface OR the button in the Object and Timeline and release.

  image

 Then in the properties tab give the new EventToCommand the name “GoToPage2”, the EventName should already set to Click, if it is not change it.

  image

 Save your changes, and if you view the xaml now you should see the following code

<Button Content="Button" Height="72" HorizontalAlignment="Left" Margin="154,354,0,0" x:Name="button1" VerticalAlignment="Top" Width="160" >
	<i:Interaction.Triggers>
		<i:EventTrigger EventName="Click">
			<GalaSoft_MvvmLight_Command:EventToCommand x:Name="GoToPage2" Command="{Binding GoToSecondPageCommand, Mode=OneWay}"/>
		</i:EventTrigger>
	</i:Interaction.Triggers>
</Button>

Next step, back to Visual Studio to add the last bit of code to the MainViewModel.  Add a new RelayCommand which is in the MvvmLight.Command namespace.


public RelayCommand GoToSecondPageCommand
{
	get;
	private set;
}

Then in the constructor in the “else” portion you need to instantiate the RelayCommand and add the handler to send the message. Add the following code


GoToSecondPageCommand = new RelayCommand(() =>
                {
                    MessageBox.Show("Going to Second Page now");
                    Messenger.Default.Send<NavigateToPageMessage>(new NavigateToPageMessage() { PageName = "SecondPage" });
                });

One last step here is to tell the EventToCommand that we added in Blend that this is the command to execute when the Click event is fired.  we do this by setting the Command property in the xaml to the following:


<Button Content="Button" Height="72" HorizontalAlignment="Left" Margin="154,354,0,0" x:Name="button1" VerticalAlignment="Top" Width="160" >
	<i:Interaction.Triggers>
		<i:EventTrigger EventName="Click">
			<GalaSoft_MvvmLight_Command:EventToCommand x:Name="GoToPage2" Command="{Binding GoToSecondPageCommand, Mode=OneWay}"/>
		</i:EventTrigger>
	</i:Interaction.Triggers>
</Button>

Save all and run

      GoingTo2ndPage2ndPsge

 Click Ok and next page is presented.

 Now go build some apps!

Download Code for Part 2 here
Read more →

Thursday, July 26, 2012

Orlando Windows Phone & Metro User Group Announces - Dark Sky API Developer App Contest!

,
Orlando Windows Phone & Metro User Group Announces - Dark Sky API Developer App Contest! 

 Are you a Florida based developer?


Have some skills you're dying to show off?

Well now is the time!

 In support of the Florida .NET Development Community OrlandoWPUG is sponsoring a friendly contest of our development talent to find the best Windows Phone 7 and Windows 8 application using the Dark Sky API.


Dark Sky is a new kind of weather app. It uses state-of-the-art weather forecasting to predict when it will rain or snow — down to the minute — at your exact location, and presents it to you alongside the most beautiful radar visualizations you’ve ever seen.

Joel Martinez (@joelmartinez), founder of the Orlando .NET User Group (@ONETUG), has created the C# wrapper for the Dark Sky API - see the details on Github. Prizes - they are going to be good! There will be one grand prize for the "Best Windows Phone 7 Application" and one for the "Best Windows 8 Metro Application"

 Watch for more details - Sign up, follow Shayne Boyer aka TattooCoder, OrlandoWPUG Founder (@spboyer) and @OrlandoWPUG for announcements of start dates and further details....

Resources



Read more →

Wednesday, July 18, 2012

Getting started with Windows Phone and MVVM Light - Part 1 of 2

,

A few days ago, Rich Dunbar wrote a post about how to get started with with Windows Phone Development and the post went freaking viral. Now the reason here is that Rich, in his spare time, sponsors and host events for Nokia in order to promote Windows Phone Development and as a a reward will get you a Nokia Device and App Hub Token. A pretty nice prize for learning how to write apps for Windows Phone.

 The post is a pretty good resource on where to get what you need to get started and how to get the prize. Here is an excert...


Every time I tweet about new Windows Phone developers being able to receive a free Microsoft App Hub registration token (a $99 value) and a sweet Nokia Lumia dev device (currently I have Lumia 800's), I get a lot of "I sure wish I could make an app" responses. So I am writing this post to help you know just where to start and what tools are available to help you be successful in a hurry.
Step 1: Download and install the necessary SDK, SDK update and Silverlight tool kit for Windows Phone development.
WP7 SDK 7.1: http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=27570 
WP7 SDK 7.1.1 Update: http://www.microsoft.com/en-us/download/details.aspx?id=29233
Silverlight for Windows Phone Toolkit:  http://silverlight.codeplex.com/releases/view/75888
Step 2: Bookmark or favorite the following sites for resources, code samples, tutorials, templates, icons and many other things to help you get started and continue developing. 
...Read more

In Orlando on the 10th of August, he is hosting an event that covers a lot if not all of the post step by step.  Sign up here if you're in that area: Nokia Meetup - Orlando, FL | Aug 10, 2012 - Meetup http://bit.ly/NHchzF .

What I wanted to do with this post is give you what I think is another need to know when developing Windows Phone Applications and that's the MVVM design pattern using MVVM Light by Laurent Bugnion. So, here goes.

There are a few other MVVM Frameworks available, but this by far is my favorite and in fact was also used by Amazon in their Kindle for Windows Phone application.

Start by going here and installing the latest version, this will install the templates within Visual Studio and what you'll need to complete the steps in this walk through as well as future applications I look forward to seeing.

Creating the Application


Open Visual Studio (I'm using 2010 for this), select New Project and in the Installed Templates you'll see MVVMLight(WP71).


You'll notice that MVVM Light supports WP7 and WP7.1, it also supports Windows 8 too!
I left the name of the project MVVMLight1 just for example purposes.  Go ahead and click OK and create the project. Before we write an additional code let's just hit F5 and make sure that the project compiles and the "test" initial page fires up.  This ensures that the template / framework and all of the pieces and parts of MVVM Light are operational.  If so, you should see the following:


Connecting the View and the View-Model


First let's look at the View. Open MainPage.xaml, and take a look at line 17.  The most important piece of MVVM is setting the DataContext of the View.  This allows the View to know where to look for its data or bindings.

<phone:PhoneApplicationPage x:Class="MvvmLight1.MainPage"
                            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                            xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
                            xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
                            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
                            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
                            FontFamily="{StaticResource PhoneFontFamilyNormal}"
                            FontSize="{StaticResource PhoneFontSizeNormal}"
                            Foreground="{StaticResource PhoneForegroundBrush}"
                            SupportedOrientations="Portrait"
                            Orientation="Portrait"
                            mc:Ignorable="d"
                            d:DesignWidth="480"
                            d:DesignHeight="768"
                            shell:SystemTray.IsVisible="True"
                            DataContext="{Binding Main, Source={StaticResource Locator}}">

You'll notice that instead of binding to an object directly, the DataContext is set to a StaticResource Property called Main within Locator. We'll put that aside for now until we cover the rest of the information here in the view.

Next, if you move down to line 32, you'll see where the view is binding to properties in the View-Model.

<StackPanel x:Name="TitlePanel"
            Grid.Row="0"
            Margin="24,24,0,12">
    <TextBlock x:Name="ApplicationTitle"
               Text="{Binding ApplicationTitle}"
               Style="{StaticResource PhoneTextNormalStyle}" />
    <TextBlock x:Name="PageTitle"
               Text="{Binding PageName}"
               Margin="-3,-8,0,0"
               Style="{StaticResource PhoneTextTitle1Style}" />
</StackPanel>

<Grid x:Name="ContentGrid"
      Grid.Row="1">

    <TextBlock Text="{Binding Welcome}"
               Style="{StaticResource PhoneTextNormalStyle}"
               HorizontalAlignment="Center"
               VerticalAlignment="Center"
               FontSize="40" />
</Grid>

By setting the Text property equal to {Binding Welcome} for example it is telling the view to get the value from the View-Model which is subsequently set in the DataContext of the View as stated above. So in looking at ViewModel/MainViewModel.cs in the solution explorer you'll see that that value is set to "Welcome to MVVM Light".

public string Welcome
        {
            get
            {
                return "Welcome to MVVM Light";
            }
        }

ViewModelLocator

Ok, so back to the ViewModelLocator. This class is the air traffic controller, if you will, of linking up your views with the view models, well that's how I look at it anyway.  It's responsible for creating and disposing of all of your View-Models, and although it is not the only way to do this; it is the way MVVM Light does it.

One thing that I'll state is that other than adding additional views, I almost never touch the ViewModelLocator code, it's thoughtless when it comes to the core app development.

The application sets a resource in App.xaml as shown below:

 <Application.Resources>
     <vm:ViewModelLocator x:Key="Locator"
                          d:IsDataSource="True" />
 </Application.Resources>

Seems pretty cut and dry. BUT where a majority of the examples I have seen concerning MVVM Light stop is right here. Other that some specific how to do this or that, I think they fall short for the beginner.  So, the next step is adding an additional page. So let's move on...

Adding a Second Page

For the sake of organization and keeping a little sanity when getting into large applications let's add a new folder called "View".  Next, right click and select Add -> New Item. You'll see now that within the Add Item Dialog you have a few options for MVVM Light as well as the traditional add items.



Select MvvmView (WP7) and name it SecondPageView.xaml and click ok.  You'll notice that the structure, DataContext, etc is exactly the same of MainPage.xaml, essentially it's a template and easy to change.

Next, we will add a new View-Model. So, right click the ViewModel folder and select Add->New Item->MvvmViewModel (WP7), name the View-Model "SecondPageViewModel.cs" and click Add.



In order to wire up the new View and View-Model we must open up the ViewModelLocator.cs class and take advantage of the snippets that MVVM Light gives us to do so and then do a little clean up.

Go to just above the constructor and type in the following and hit enter -
mvvmlocatorproperty
What this snippet does is add the following items to the class.

private static ViewModelType _viewModelPropertyName;

        /// 
        /// Gets the ViewModelPropertyName property.
        /// 
        public static ViewModelType ViewModelPropertyNameStatic
        {
            get
            {
                if (_viewModelPropertyName == null)
                {
                    CreateViewModelPropertyName();
                }

                return _viewModelPropertyName;
            }
        }

Now the snippet will highlight the ViewModelType identifier first and you will want to change this to SecondPageViewModel, then hit tab. Second, change the _viewModelPropetyName to _viewModelSecondPage and hit tab. Finally, you will be navigated to the comment portion for the ViewModelPropertyName and change this to SecondPageViewModel. When you are done it should look like this...

private static SecondPageViewModel _viewModelSecondPage;

        /// 
        /// Gets the ViewModelSecondPage property.
        /// 
        public static SecondPageViewModel ViewModelSecondPageStatic
        {
            get
            {
                if (_viewModelSecondPage == null)       
                {
                    CreateViewModelSecondPage();
                }

                return _viewModelSecondPage;
            }
        }

Ok, now a little work to do to make this addition complete.  Need to add " CreateViewModelSecondPage();" to the constructor just under "CreateMain();".  This ensures that the instance of the new View-Model is created.

Next, one draw back is that the snippet creates a duplicate of "Cleanup()", so if you get the following error:

Type 'MvvmLight1.ViewModel.ViewModelLocator' already defines a member called 'Cleanup' with the same parameter types
You'll need to also move the contents of the duplicated method to the existing Cleanup method. In our case, the contents are " ClearViewModelSecondPage();".

Last step, go to the SecondPageView.xaml and change the value in the DataContext to the new ViewModel.

from:

DataContext="{Binding ViewModelName, Source={StaticResource Locator}}">

to:

DataContext="{Binding SecondPageViewModel, Source={StaticResource Locator}}">

Part 2 we'll see how to add a button on the first page to navigate to the second page which will cover navigation and messaging.

Download code for Part 1 here
Read more →

Monday, July 16, 2012

Orlando Windows Phone User Group - Kickoff Meeting

,
owpug.tattoocoder.com
Wow what a great start to the new group in Orlando!

First, let me start by thanking Voxeo  (@voxeo) for hosting the event.  What a great room, theater seating, barista on staff, great office space...very tech!  They do offer co-lo office space so hit them up if you are a startup and you need some space.  Almost every wall in this place is a whiteboard.

Those chairs were awesome!
Attendees included Windows Phone MVPs, authors, ComponentOne, Windows Phone Marketplace champs, newbies and even non Windows Phone devs; exactly what I was looking for when starting this group. A really exciting group to engage in and the conversation and interaction was more than I expected.

As I said at the beginning, it's a very exciting time to be a developer in the Microsoft .NET stack of technology. If you're not, you either doing the wrong thing or you're dead!

With the recent announcements of Windows Phone 8 and Surface, I can't think of a better time to sharpen your skills or pick a new path in your development career.

Luis and Alex telling us the tricks.
Next up, we had Alex (@Aapg1102) and Luis Perez (@LuisNeuralnet) from Neuralnet Systems present their take on tips and tricks, the unspoken rules.

Now these guys have the goods!  They have 42 applications in the Marketplace and have gone through the paces when it comes to marketing, updates, when to what how, and what NOT to do. For those of you who attended, the slide deck is available here to refresh your memory as I am sure it was more information then you could retain in the hour long presentation.
Highlights for me were:

  • How does the PubCenter really works
    • eCPM experiences
    • Why 10,000 impressions aren't 10,000 impressions
  • Aftermath of an application
    • kind of - "It's out there...what's next"
The group was full of questions and even the experienced developers in the crowd walked away with some info they felt was rewarding.

As a sponsor of the group Russ (@russcamtv) and ComponentOne dished out ComponentOne Studio for Windows Phone for all in attendance, huge thanks to them!  I look forward to seeing some great apps using these controls.

ComponentOne offers great developer controls for Windows Phone, Windows 8, as well as other .NET platform development tools.


Next meeting will be hosted at the brand new Microsoft Store in the Florida Mall on August the 17th at 6:30 PM.  This is there official opening week, and we have been asked to be there the day after they open to use their fantastic theater.  Checkout the Meetup page for the store. for details on the location and theatre spec sheet.  I will be sending out more information as soon as we secure the speakers and agenda. 





And finally, please pickup Joe Healy (@devfish) and Kevin Wolf's (@ByteMaster) book; Sam's Teach Yourself Windows Phone 7 Application Dev in 24 Hours.  Both were in attendance, signing copies and contributing much knowledge about current and future state of Windows Phone and Windows 8 development.  Thanks to both of you!







Pictures courtesy of RussCam!
Luis and Alex

Good crowd, filled with talent.

TattooCoder

Shayne, Alex, Luis and Russ

Shayne and the Guys from Neuralnet

Read more →
Powered by Blogger.
 
Creative Commons License
TattooCoder.com by Shayne Boyer is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.