Isolated Storage Serializer

Kiedy pisze się już któryś z rzędu program na daną platformę, często sięgamy do swoich poprzednich programów, żeby skopiować jakąś funkcję albo całą klasę, bo czegoś podobnego właśnie potrzebujemy. Klasa zapisana poniżej, się chyba w każdym projekcie windows phonowym. Dzięki niej za pomocą jednej metody można zserializować lub zdeserializować obiekt do/z isolated storage.

 public class IsolatedStorageSerializer<T>
    where T : class
{
    public void Serialize(T objectToSerialize, string path)
    {
        if (String.IsNullOrEmpty(path) || objectToSerialize == null)
            return;

        using (var isolated = IsolatedStorageFile.GetUserStoreForApplication())
        {
            if (isolated.FileExists(path)) isolated.DeleteFile(path);

            Stream stream = null;
            try
            {
                stream = isolated.OpenFile(path, FileMode.OpenOrCreate, FileAccess.Write);
                var serializer = new XmlSerializer(typeof(T));
                serializer.Serialize(stream, objectToSerialize);
            }
            finally
            {
                if (stream != null) stream.Close();
            }
        }
    }

    public T Deserialize(string path)
    {
        T result = null;
        if (!String.IsNullOrEmpty(path))
        {
            using (var isolated = IsolatedStorageFile.GetUserStoreForApplication())
            {
                if (isolated.FileExists(path))
                {
                    Stream stream = null;
                    try
                    {
                        stream = isolated.OpenFile(path, FileMode.Open, FileAccess.Read);
                        var serializer = new XmlSerializer(typeof(T));
                        result = serializer.Deserialize(stream) as T;
                    }
                    finally
                    {
                        if (stream != null) stream.Close();
                    }
                }
            }
        }
        return result;
    }
}

Computer Auto Shutdown

Wychodzisz na imprezę, a została Ci godzina do pobrania Windows 8? Możesz zostać w domu, zostawić włączonego kompa na całą noc albo napisać na szybko program, który Ci go wyłączy za godzine.

Ja wybrałem tę ostatnią opcję. Mając więc nadzieję, że komuś się może ta apka przyda i dzięki mnie nie spóźni się na koncert, wrzucam ją na swojego skydrive.

Link do pobrania: http://sdrv.ms/TNGkva

PasswordBox z podpowiedzią w WP7

Dzisiaj kolejny post typu „skopiuj kod i działa”. Tym razem chciałbym napisać jak w WP7 zrobić PasswordBox z możliwością wpisania podpowiedzi, coś jak placeholder w htmlowych znacznikach input.

Po pierwsze będzie nam do tego potrzebny Silverlight Toolkit for Windows Phone, który daje nam fajną kontrolkę PhoneTextBox, niestety nie możemy już liczyć na PhonePasswordBox, dlatego musimy to jakoś obejść.

Efektem naszego kodu powinien być taki formularz:

Na początek w miejscu gdzie chcemy umieścić nasz passwordbox wklejamy taki oto kod:

<Grid VerticalAlignment="Top">
    <toolkit:PhoneTextBox  Name="passwordHintBox" Hint="Password" GotFocus="passwordHintBox_GotFocus" />
    <PasswordBox Name="passwordBox" Visibility="Collapsed" LostFocus="passwordBox_LostFocus"/>
</Grid>

Jak widać oba te elementy na siebie nachodzą. Przy czym w PasswordBox ustawiamy domyślnie Visibility na Collapsed, żeby nie był pokazywany w designerze, oraz przy uruchomieniu. Kluczowymi metodami, które musimy obsłużyć są GotFocus dla TextBox’a, oraz LostFocus dla PasswordBox’a.

private void passwordHintBox_GotFocus(object sender, RoutedEventArgs e)
{
    passwordHintBox.Visibility = Visibility.Collapsed;
    passwordBox.Visibility = Visibility.Visible;
    passwordBox.Focus();
}   

private void passwordBox_LostFocus(object sender, RoutedEventArgs e)
{
    if (String.IsNullOrEmpty(passwordBox.Password))
    {
        passwordBox.Visibility = Visibility.Collapsed;
        passwordHintBox.Visibility = Visibility.Visible;
    }
}

Tak więc, tłumacząc kod… jeśli użytkownik będzie chciał napisać coś w polu password, schowamy textbox z podpowiedzią, a pokażemy mu PasswordBox, od razu ustawiając na nim Focus, żeby mógł pisać. Jeśli użytkownik przestanie pisać i odznaczy kontrolkę passwordbox, sprawdzamy czy wpisał jakieś hasło, jeśli nie to ponownie pokazujemy mu textbox z podpowiedzią, jeśli coś wpisał, zostawiamy passwordbox.

Kod niby jest prosty, ale warto mieć czasami go pod ręką, żeby móc na szybko przepisać i nie głowić się, którą metodę i jak trzeba obsłużyć.

Dla Hejterów:
Żeby móc użyć kontrolki PhoneTextBox w taki sposób: toolkit:PhoneTextBox, musimy oczywiście dodać referencje i dodać przestrzeń nazw:

xmlns:toolkit="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Toolkit"