Visualizzazione post con etichetta tips. Mostra tutti i post
Visualizzazione post con etichetta tips. Mostra tutti i post

venerdì 13 settembre 2013

Force binding update for a TextBox


The TextBox control updates the Text binding source only when it looses focus.

When you are writing in a TextBox and you press a button in the ApplicationBar, the focus not changes and your MVVM property doesn't update.

The workaround is to force the binding update like this:
 
var focusedElement = FocusManager.GetFocusedElement();
var focusedTextBox = focusedElement as TextBox;

if (focusedTextBox != null)
{
    var binding = focusedTextBox.GetBindingExpression(TextBox.TextProperty);
    if (binding != null)
        binding.UpdateSource();
}


mercoledì 21 agosto 2013

Restore NuGet Packages


To restore NuGet packages you need only few steps:

1- In Visual Studio Options --> Package Manager -> Check "Allow NuGet to download missing packages during build".


2- In the Solution --> Enable NuGet Package Restore.


3- Build your project.

That's all!

giovedì 15 agosto 2013

String format in Xaml

When you need to concatenate some strings in a TextBlock you can use the tag like Run.

Silverlight 4 has introduced an useful feature to make this more easy: StringFormat.
Now you can put more informations in a single element.

The code is very simple:
<TextBlock Text="{Binding Username, StringFormat='Hello \{0\}'}" />
<TextBlock Text="{Binding Temperature, StringFormat=\{0\}°}" />

and it works also with numbers and dates:
<TextBlock Text="{Binding Value, StringFormat=\{0:n2\}}" />
<TextBlock Text="{Binding Value, StringFormat=\{0:c2\}}" />
<TextBlock Text="{Binding Date, StringFormat=f}" />

You can check more details in the Kunal's blog

martedì 19 febbraio 2013

PeriodicTask bug in Windows Phone 8


After almost two months, WPDev Team has confirmed a bug for PeriodicTask in Windows Phone 8:

PeriodicTask fails to trigger if there is no network connectivity in WP8 (enable Airplane mode,  or disable both cellular and wifi.

Here my discussion: http://social.msdn.microsoft.com/Forums/en-US/wpdevelop/thread/216a9f3d-9284-4d1e-ac2a-83f2d13e361c


mercoledì 6 febbraio 2013

Easy SQL CE on Windows Phone

In Windows Phone is very simple to add and use SQL CE database.
What you need? Nothing... it's built in the Windows Phone Runtime.

Let's start...

If not exists, add the reference System.Data.Linq in your project.

Create the class to map the entity to the table:
[Table(Name="Utenti")]
public class Utente
{
    [Column(IsPrimaryKey = true, IsDbGenerated = true)]
    public int Id { get; set; }

    [Column(CanBeNull = false)]
    public string Name { get; set; }
}
You can see the attributes for the table and columns: table name, primary key, etc..

Now add a class for DataContext with the reference to the table Utenti. The DataContext wraps all operations you can do with database:
public class MyDataContext: DataContext
{
    public const string ConnectionString = "isostore:/mydatabase.sdf";

    public Table<Utente> Utenti { get; set; }

    public MyDataContext(string connectionString)
        : base(connectionString)
    {
        this.Utenti = this.GetTable<Utente>();
    }
}
ConnectionString has the special path to locate the database file in the isolated storage.

The classes for SQL CE are ready.
The last thing is create the physical .sdf file when the application start.
private void Application_Launching(object sender, LaunchingEventArgs e)
{    
    using (var context = new MyDataContext(MyDataContext.ConnectionString))
    {
        if (!context.DatabaseExists())
            context.CreateDatabase();
    }
}

And now enjoy with your LinqToSql queries!
using (var context = new MyDataContext(MyDataContext.ConnectionString))
{
    var utenti = context.Utenti.OrderByDescending(u => u.Name).ToList();
}

Remember the "using" statement, because you need to dispose your DataContext to prevent high memory usage. The cost to create a new istance is very small.

NOTE: if you want to build an application for Windows 8/RT, maybe SQL CE is not your way. Why? Unfortunately Windows 8/RT don't support it. In this case you can use SQLITE.

domenica 2 dicembre 2012

Windows Phone - Battery API

One of the new additions with the Windows Phone SDK 8.0, is the ability to query the battery charge.

Here the simple code:
Battery battery = Battery.GetDefault();
var percentage = battery.RemainingChargePercent;
var remainingTime = battery.RemainingDischargeTime;

And the event:
battery.RemainingChargePercentChanged += (s, args) =>
{
 // your code here
};

Enjoy!

domenica 28 ottobre 2012

Windows Phone - Localization

When you publish a Windows Phone application in the Marketplace, you have more visibility if you support the region language.

An easy way to build a localized app is to use resources file (.resx).

First of all remember to set the default "neutral" language in the project properties! This is an important step because the "AppResources.resx" file is used from all not specified languages.

Add new file, and name it "AppResources.resx" for default language. For a new language, just add a new resource named with the CultureInfo ISO letters:
  • AppResources.it-IT.resx for italian language.
  • AppResources.cs-CZ.resx for czech language.
  • AppResources.fr-FR.resx for french language.
  • etc..
Remember to set all resource files to the public access modifier.



Now unload your project and edit the csproj file to add your supported language:
<SupportedCultures>it-IT;en-US;cs-CZ;fr-FR</SupportedCultures>

Create a class to get your resources.

public class LocalizedStrings
    {
        private static AppResources localizedResources = new AppResources();

        public AppResources Strings
        {
            get
            {
                return localizedResources;
            }
        }
    }

In your xaml you need to declare your class as resource:
<phone:PhoneApplicationPage.Resources>
     <local:LocalizedStrings x:Key="LocalizedStrings"/>
 </phone:PhoneApplicationPage.Resources>

Now you can use your localized string like this:
Text="{Binding Strings.Loading, Source={StaticResource LocalizedStrings}}"
Or from code behind:
txtLoading.Text = AppResources.Loading;

To test your app you can insert this code in application launching event:
Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("it-IT");
Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("it-IT");

All CultureInfo codes here.

venerdì 19 ottobre 2012

Windows Phone - Get Album Art

When you use MediaPlayer class in Windows Phone, usually you want to get the album cover for the current song.
You can access the current track with the ActiveSong property. This property is exposed by the Queue of MediaPlayer. Then you can check out the album art.

This code is all you need:

if (MediaPlayer.Queue.ActiveSong.Album.HasArt)
{
 BitmapImage bmp = new BitmapImage();
 bmp.SetSource(MediaPlayer.Queue.ActiveSong.Album.GetAlbumArt());
 imgAlbum.Source = bmp;
}

sabato 6 ottobre 2012

Equality Comparer with Lambda

Today, it's normal to write code with LINQ and Lambda Expressions.
But when you need to use IEqualityComparer, it's not possibile to use a lambda predicate.
The Interface needs a class, then you have to create a new type that inherit from IEqualityComparer.

You can use this workaround:
 
public class EqualityComparer<T> : IEqualityComparer<T>
{
   private Func<T, T, bool> _fnEquals;
   private Func<T, int> _fnGetHashCode;
   public EqualityComparer(Func<T, T, bool> fnEquals, Func<T, int> fnGetHashCode)
   {
      _fnEquals = fnEquals;
      _fnGetHashCode = fnGetHashCode;
   }
   public bool Equals(T x, T y)
   {
      return _fnEquals(x, y);
   }
   public int GetHashCode(T obj)
   {
      return _fnGetHashCode(obj);
   }
}

The simple usage is:

 
Dictionary<int, string> d = new Dictionary<int, string>() { { 1, "a" }, { 2, "a" }, { 3, "b" } };

var d2 = d.Distinct(new EqualityComparer<KeyValuePair<int, string>>((kvp1, kvp2) => kvp1.Value == kvp2.Value, kvp => kvp.Value.GetHashCode()));

lunedì 24 settembre 2012

Windows Phone - Settings Page in 5 minutes

The best user experience for a settings page is: stay away from the save button.

People don't love to press the back button and lose all settings. Then it's better to save when the user does something.

Thanks to Jerry Nixon you can use this code and have a base framework for all your applications.

    public static bool EnableLocation
    {
        get { return Get("EnableLocation", false); }
        private set { Set("EnableLocation", value); }
    }

    public static event PropertyChangedEventHandler SettingChanged;

    private static T Get<T>(string key, T otherwise)
    {
        try
        {
            return (T)IsolatedStorageSettings.ApplicationSettings[key];
        }
        catch { return otherwise; }
    }

    private static void Set<T>(string key, T value)
    {
        IsolatedStorageSettings.ApplicationSettings[key] = value;
        if (SettingChanged != null)
            SettingChanged(null, new PropertyChangedEventArgs(key));
    }

The code is very easy:
  • the "Get" function return the default value if the key don't exists.
  • the "Set" function uses an event to immediatly reflect changes into your apps.
  • the functions use "Generics".

Enjoy!

giovedì 13 settembre 2012

Windows Phone - Live Tiles with Telerik

The default Windows Phone framework offers a simple template for tiles:
  • Static background image from application or from url.
  • Title.
  • Number (top right).
  • A back message.

With Telerik RadControl for Windows Phone you have more power in your hands!


myWeather

"LiveTileHelper" class helps you to create dynamic live tiles with your own design and your own content.

The "RadExtendedTileData" extends the standard tile data with two properties VisualElement and BackVisualElement.
Now the amazing thing: this properties accept UIElement. Yes, UIElement!!

Now let's code...
LiveTileHelper.CreateOrUpdateTile( 
 new RadExtendedTileData() 
 { 
  Title = "My front title",
  VisualElement = new MyUserControl(),
  BackTitle = "My back title" 
  BackContent = "My back message", 
  BackVisualElement = new MyUserControl2(), 
 }, 
 new Uri("/MainPage.xaml?param=myparam", UriKind.RelativeOrAbsolute)
);

You can customize MyUserControl and MyUserControl2 as you want, the only limit is your imagination.

Then, why should you use this controls?
  • Easyness
  • More features
  • Time saver
  • Support and help

And remember this: a good app, has a good live tile.

sabato 8 settembre 2012

Windows Phone - Low memory devices

SDK 7.1.1 includes features specifics to developing for 256MB devices (Nokia Lumia 610 and others).

Low memory devices have some limitations, then you need to check the memory size and if needed, disable some features to target the largest possible market.

First, you need this MemoryHelper:
public static class MemoryHelper
{
 public static bool IsLowMemDevice { get; set; }

 static MemoryHelper()
 {
   try
   {
     Int64 result = (Int64)DeviceExtendedProperties.GetValue("ApplicationWorkingSetLimit");
    if (result < 94371840L) IsLowMemDevice = true; else IsLowMemDevice = false;
   }
   catch (ArgumentOutOfRangeException)
   {
     //windows phone OS not updated, then 512mb
     IsLowMemDevice = false;
   }
 }
}

Now you can easy detect device type:
if (MemoryHelper.IsLowMemoryDevice)
 // do some work


Tips:
  • PeriodicTask and ResourceIntensiveTask classes are not supported to 256MB phones. This background agents throw an exception if you try to schedule them on this devices.
  • Check your app with Windows Phone Memory Profiler (it is included in VS2010).
  • Use WebBrowserTask instead of the <WebBrowser /> control to display web pages.
  • Use BingMapsTask instead <Map /> control.
  • Consider to reduce image quality and reduce the number of the animations.
  • Avoid long lists of data. The best practice is to use data virtualization.
  • Consider to disable page transitions.
  • Remember to test your application with all two emulators!

giovedì 6 settembre 2012

Windows Phone - Keyboard suggestions

In Windows Phone standard apps (like mail and messaging), when you enter a text, you will see the list of suggestions for the text you are typing.

In your app, every Textbox has the ability to have an InputScope assigned to it.

XAML:
<TextBox InputScope="Text" /> 
 
InputScope help the developer to assign also the good keyboard for the context:
 
  • URL: this keyboard gives you a ".com" button to finish typing your URLs, but that button, with a long-tap, will also expand to show you .net, .org, .edu, and .co.uk.
  • TelephoneNumber: it gives the user a numeric dial pad instead of an alphabetic keyboard.
  • EmailNameOrAddress: it gives a period, an @ symbol and ".com" button.

You can find more InputScopeNameValue enumerator on MSDN.

Windows Phone - Share Status Task

Microsoft made available to developers some Launchers and Choosers.
Now is very easy to share your status in the most popular social networks with a simple code:

ShareStatusTask shareStatusTask = new ShareStatusTask();

shareStatusTask.Status = "Hello, today is a great day";

shareStatusTask.Show();