PhonePasswordBox

.Net/Windows Phone 2012.06.08 09:51

툴킷에 있는 PhoneTextBox 는 정말 맘에 드는 컨트롤 중 하나이다.

따로 TextBlock 을 둬서 TextBox에 어떤내용인지 설명을 하지 않아도 된다.

화면사이즈에 제약이 있는 Phone 환경에서는 꼭 필요한 컨트롤 중 하나이다.

 

하지만 PasswordBox 에서는 해당 기능이 지원되지 않는다.

그래서 찾아본 링크

http://damianblog.com/2011/01/21/wp7-password-watermark/

 

링크를 참조하여 내게 필요한 몇가지 기능을 추가했다.

아래는 소스.

======================== PhonePasswordBox.cs =======================

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace BloodAria.MyMusic.Controls
{
    public partial class PhonePasswordBox : UserControl
    {
        #region DependencyProperty

        public static readonly DependencyProperty HintProperty =
            DependencyProperty.Register("Hint", typeof(string), typeof(PhonePasswordBox), new PropertyMetadata("Password",
                    new PropertyChangedCallback(OnHintPropertyChanged)
                )
            );
        private static void OnHintPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args)
        {
            PhonePasswordBox phonePasswordBox = sender as PhonePasswordBox;
            if (phonePasswordBox != null && phonePasswordBox.txtBoxPasswordHint != null && args.NewValue != null)
            {
                phonePasswordBox.txtBoxPasswordHint.Text = args.NewValue as string;
            }
        }

        public static readonly DependencyProperty PasswordProperty =
            DependencyProperty.Register("Password", typeof(string), typeof(PhonePasswordBox), new PropertyMetadata(
                    new PropertyChangedCallback(OnPasswordPropertyChanged)
                )
            );
        private static void OnPasswordPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args)
        {
            PhonePasswordBox phonePasswordBox = sender as PhonePasswordBox;
            if (phonePasswordBox != null && phonePasswordBox.txtBoxPassword != null && args.NewValue != null)
            {
                phonePasswordBox.txtBoxPassword.Password = args.NewValue as string;
                phonePasswordBox.CheckPasswordWatermark();
            }
        }

        #endregion

        #region Properties

        public string Hint
        {
            get { return base.GetValue(HintProperty) as string; }
            set { base.SetValue(HintProperty, value); }
        }
        public string Password
        {
            get { return base.GetValue(PasswordProperty) as string; }
            set { base.SetValue(PasswordProperty, value); }
        }

        #endregion

        #region Events

        public event RoutedEventHandler PasswordChanged;

        #endregion

        public PhonePasswordBox()
        {
            InitializeComponent();
            txtBoxPassword.PasswordChanged += (s, e) => this.Password = txtBoxPassword.Password;
            txtBoxPassword.PasswordChanged += (s, e) => { if (PasswordChanged != null) PasswordChanged(this, e); };
            txtBoxPasswordHint.TextChanged += (s, e) => this.Hint = txtBoxPasswordHint.Text;
            txtBoxPasswordHint.Text = "Password";
        }

        protected override void OnGotFocus(RoutedEventArgs e)
        {
            base.OnGotFocus(e);
            this.txtBoxPassword.Focus();
        }
       
        private void PasswordLostFocus(object sender, RoutedEventArgs e)
        {
            CheckPasswordWatermark();
        }
       
        public void CheckPasswordWatermark()
        {
            var passwordEmpty = string.IsNullOrEmpty(txtBoxPassword.Password);
            txtBoxPasswordHint.Opacity = passwordEmpty ? 100 : 0;
            txtBoxPassword.Opacity = passwordEmpty ? 0 : 100;
        }

        private void PasswordGotFocus(object sender, RoutedEventArgs e)
        {
            txtBoxPasswordHint.Opacity = 0;
            txtBoxPassword.Opacity = 100;
        }
    }
}
======================== PhonePasswordBox.xaml =======================

<UserControl x:Class="BloodAria.MyMusic.Controls.PhonePasswordBox"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    d:DesignHeight="100" d:DesignWidth="400">

    <Grid>
        <TextBox x:Name="txtBoxPasswordHint" TextWrapping="Wrap" Foreground="{StaticResource PhoneTextBoxReadOnlyBrush}" IsHitTestVisible="False"/>
        <PasswordBox x:Name="txtBoxPassword" LostFocus="PasswordLostFocus" Opacity="0" GotFocus="PasswordGotFocus"/>
    </Grid>
</UserControl>

설정

트랙백

댓글

Enum.GetValues()

.Net/Windows Phone 2012.06.05 17:11

WPF 에서는 당연한듯 썼던 Enum.GetValues() 가 없다. (실버라이트 동일)

열거형 타입의 모든 값을 가져와서 ListPicker 에 바인딩 시킬려고 했는데 너무 손이 많이 갔다.

아이템을 수동으로 추가하는 방법도 있으나 맘에 안들고...

 

찾던중 발견한 링크.

http://cjbhaines.wordpress.com/2011/07/12/enum-getvalues-in-silverlight/

 

아래는 소스.

 

using System.Linq;

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Diagnostics;

 

namespace BloodAria.MyMusic.Common
{
    public static class EnumHelper
    {
        public static T[] GetValues<T>()
        {
            Type enumType = typeof(T);
            if (!enumType.IsEnum)
                throw new ArgumentException("Type '" + enumType.Name + "' is not an enum");

            IEnumerable<FieldInfo> fields = enumType.GetFields().Where(field => field.IsLiteral);

            return fields.Select(field => field.GetValue(enumType)).Select(value => (T)value).ToArray();
        }
    }
}

 

설정

트랙백

댓글

Phone Thema에 따른 Color, Content변경

.Net/Windows Phone 2011.12.27 00:19
폰 테마가 밝게 일때와 어둡게 일때 나눠서 컨텐트 또는 색상을 준비해놔야 되는구나...
젠장.. 신경쓸거 많네..

나중에 정리하기로하고..
일단 찾아놓은 링크만 포스트!



테마관련 MSDN 링크 : http://msdn.microsoft.com/en-us/library/ff769554(v=VS.92).aspx
테마 리소스 목록 : http://msdn.microsoft.com/en-us/library/ff769552(v=VS.92).aspx
예제 : http://www.mendzapp.com/archives/196
         http://timdams.wordpress.com/2011/06/21/creating-a-wp7-app-supporting-dark-and-light-themes/

설정

트랙백

댓글

아놔... 툴킷 만들었으면 제대로 관리하라고!!

.Net/Windows Phone 2011.12.22 11:03
헤이! 이것봐!!! 이런걸 보고 다 해주고 욕먹는거라자나!

툴킷 만들고 수정했으면 제대로 올려야지 이넘들아!

2011 Nov 버전이라고 해서 다운받아서 설치했더니...
설치된 버전은 2011 Oct 버전이자나!!!

아놔.. 한참 찾아해맸네...

msi 파일 다시 말아!

소스는 정상적이더군... 소스 내려받아서 수정완료! 

설정

트랙백

댓글

Windows XP에서 Windows Phone 개발하기

.Net/Windows Phone 2011.12.19 15:03

Windows Phone 의 최소개발환경이 Windows Vista, Windows 7이다..
근데.. 현재 개발PC의 OS가 Windows XP라면?

이 사이트를 참고하자
http://social.msdn.microsoft.com/Forums/en-US/windowsphone7series/thread/bd63b265-50d9-4d36-9508-716759919ee0

주의 : SDK설치 및 개발은 가능하지만 시뮬레이터는 동작하지않는다. 그이유는 시뮬레이터는 DirectX 10.0 이상이 있어야 하기때문! (Windows XP는 DirectX 9.까지 지원)

설정

트랙백

댓글

Grid에 Tab 이벤트가 잘 안먹는다고?

.Net/Windows Phone 2011.12.18 22:43


Grid에 Tab이벤트가 안먹는다... 왜 안먹을까?
근데 Grid 밑의 자식 엘리먼트를 탭하면 Grid의 Tab이벤트가 먹는다...

팁!!

Grid의 Background를 설정하면 Tab이벤트가 먹는다!
<Grid Tap="listBoxCurrentPlaybackItem_Tap" Background="Transparent" Margin="0,0,5,0">
요로케!~




<ListBox Grid.Row="1" Name="listBoxCurrentPlayback" Margin="0,20" Height="450" ItemsSource="{Binding CurrentPlaybackItems}">
      <ListBox.ItemTemplate>
       <DataTemplate>
        <Grid Tap="listBoxCurrentPlaybackItem_Tap" Background="Transparent" Margin="0,0,5,0">
         <toolkit:ContextMenuService.ContextMenu>
          <toolkit:ContextMenu>
           <!--<toolkit:MenuItem Header="Download" />-->
           <toolkit:MenuItem Header="Delete" Click="listBoxCurrentPlaybackItemContextMenuDelete_Click" />
          </toolkit:ContextMenu>
         </toolkit:ContextMenuService.ContextMenu>
         <Grid.ColumnDefinitions>
          <ColumnDefinition Width="Auto" />
          <ColumnDefinition Width="*" />
         </Grid.ColumnDefinitions>

         <Image Grid.Column="0" x:Name="icon" Width="40" Height="40" Source="/MyMusic;component/Resources/MusicIcon.png" />
         <StackPanel Grid.Column="1">
          <StackPanel Orientation="Horizontal">
           <TextBlock  Text="{Binding Title}" Style="{StaticResource MusicTitleStyle}" />
           <TextBlock  Text="-" Style="{StaticResource MusicTitleStyle}" />
           <TextBlock  Text="{Binding Album}" Style="{StaticResource MusicTitleStyle}" />
          </StackPanel>
          <StackPanel Height="30" Orientation="Horizontal">
           <TextBlock Text="{Binding Artist}" Width="280" Style="{StaticResource MusicInfoStyle}" HorizontalAlignment="Left" />
           <TextBlock Text="{Binding Duration}" Style="{StaticResource MusicInfoStyle}" HorizontalAlignment="Right" />
          </StackPanel>
         </StackPanel>
        </Grid>
       </DataTemplate>
      </ListBox.ItemTemplate>
     </ListBox>

설정

트랙백

댓글

Windows Phone 7 Resources

.Net/Windows Phone 2011.12.15 22:17
윈폰 관련한 툴, 책, 아티클, 라이브러리, 팁 등 정리된 페이지.

잘 정리해두신듯..
그나저나 이거 다볼려면 몇일이나 걸릴려나 ㅠㅠ

- ChildWindow 관련 검색을 하다가..


설정

트랙백

댓글