Isolated Storage
之所以叫isolated,是因为一个app的数据不能被另一个app访问。
IsolatedStorageSettings尽管有一个Save方法,但其实没有必要调用它。因为程序在close或deactive的时候都会保存数据。唯一说得过去的调用Save方法的时候,是因为app崩溃退出而丢失数据。
app升级后,Isolated Storage中的数据保留。app卸载后,数据删除。
Isolated Storage没有大小限制,只受手机存储大小的限制。
颜色选择控件
Shared/ColorPicker目录下有一个很好用的颜色选择控件。
使用自定义字体
<TextBlock FontFamily="Fonts/pendule_ornamental.ttf#pendule ornamental" Opacity=".1"> <!-- It's important not to have whitespace between the runs!--> <Run x:Name="TimeBackgroundRun">88:88</Run><Run x:Name="SecondsBackgroundRun">88</Run> </TextBlock>
首先把字体文件加入项目中,在XAML中的语法是:
字体文件路径#字体名
字体文件ttf在windows下能直接打开、安装。
Value Converter
主要用于:在数据绑定中用把一种类型的转换成另一种类型。
一个能够作为转换器的类型必须实现IValueConverter接口,即Convert和ConvertBack两个方法。
在单向绑定时因为不需要ConvertBack,可以让ConvertBack方法直接返回DependencyProperty.UnsetValue。
下面是实现这两个方法的一个例子:
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { DateTimeOffset date = (DateTimeOffset)value; // Return a custom format return date.LocalDateTime.ToShortDateString() + " " + date.LocalDateTime.ToShortTimeString(); } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { return DependencyProperty.UnsetValue; }
在XAML里可直接指定转换器,在指定之前,需要在资源字典里创建一个转换器的实例。
<phone:PhoneApplicationPage.Resources> <local:DateConverter x:Key="DateConverter"/> </phone:PhoneApplicationPage.Resources>
然后在XAML里引用:
<TextBlock Text="{Binding Modified, Converter={StaticResource DateConverter}}" />
如果要在XAML中指定parameter和culture则这样写:
文件读写
public string Filename { get; set; } public void SaveContent(string content) { using (IsolatedStorageFile userStore = IsolatedStorageFile.GetUserStoreForApplication()) using (IsolatedStorageFileStream stream = userStore.CreateFile(this.Filename)) using (StreamWriter writer = new StreamWriter(stream)) { writer.Write(content); } } public string GetContent() { using (IsolatedStorageFile userStore = IsolatedStorageFile.GetUserStoreForApplication()) { if (!userStore.FileExists(this.Filename)) { return string.Empty; } else { using (IsolatedStorageFileStream stream = userStore.OpenFile(this.Filename, FileMode.Open)) using (StreamReader reader = new StreamReader(stream)) { return reader.ReadToEnd(); } } } } public void DeleteContent() { using (IsolatedStorageFile userStore = IsolatedStorageFile.GetUserStoreForApplication()) { userStore.DeleteFile(this.Filename); } }