11年11月初,微軟的silverlight toolkit for phone又放出四個新控制項,這四個控制項使用都要比之前的複雜,並且很有用。
6.AutoCompleteBox
這個控制項很像ajax裡的輸入框,可以聯想詞。不過需要自已產生一個詞庫檔案,還要編寫代碼來載入詞載。在silverlgiht toolkit sample裡面已經有這個範例程式碼了(loremIpsum.cs,loremIpsum.txt,這裡只是一個拉丁文的測試檔案,所以需要自已來實現字型檔檔案)。
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<toolkit:AutoCompleteBox HorizontalAlignment="Left" Margin="63,43,0,0" Name="autoCompleteBox1" VerticalAlignment="Top" Width="317" Height="72" ItemsSource="{StaticResource words}" />
</Grid>
xmlns:data="clr-namespace:testNewControls.Data"
<phone:PhoneApplicationPage.Resources>
<data:LoremIpsum x:Name="words"/>
</phone:PhoneApplicationPage.Resources>
這個Resource定義一定要在AutoComepleteBox前面,不然會報一個很奇怪的錯誤。
LoremIpsum.cs的完整代碼如下:
// (c) Copyright Microsoft Corporation.
// This source is subject to the Microsoft Public License (Ms-PL).
// Please see http://go.microsoft.com/fwlink/?LinkID=131993 for details.
// All other rights reserved.
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Windows;
using System.Windows.Resources;
namespace testNewControls.Data
{
public static class Extension
{
public static T Next<T>(this Random rnd, IList<T> list)
{
return list[rnd.Next(list.Count)];
}
}
/// <summary>
/// A class to return paragraphs of random sentences or a word list from lorem ipsum data.
/// </summary>
public class LoremIpsum : IEnumerable<string>
{
public enum Capitalization
{
None,
FirstWord,
AllWords
}
private static Random _rnd = new Random(42);
private static StringBuilder _builder = new StringBuilder();
private static List<string> _sentences;
private static List<string> _words;
/// <summary>
/// Returns random lorem ipsum sentences combined into a single string.
/// </summary>
/// <param name="sentenceCount">The nunmber of sentences.</param>
/// <returns>The paragraph, composed of random sentences.</returns>
public static string GetParagraph(int sentenceCount)
{
EnsureSentences();
_builder.Length = 0;
while (sentenceCount-- > 0)
{
_builder.Append(_rnd.Next(_sentences));
if (sentenceCount > 0)
{
_builder.Append(' ');
}
}
return _builder.ToString();
}
/// <summary>
/// Return an alphabetized, lower-case list of lorem ipsum words.
/// </summary>
public static ICollection<string> Words
{
get
{
EnsureWords();
return (ICollection<string>)_words;
}
}
/// <summary>
/// Get a string composed of random lorem ipsum words. Will not end with punctuation.
/// </summary>
/// <param name="wordCount">Number of words.</param>
/// <param name="capitalize">How to capitalize the words.</param>
/// <returns></returns>
public static string GetWords(int wordCount, Capitalization capitalization)
{
EnsureWords();
_builder.Length = 0;
while (wordCount-- > 0)
{
int position = _builder.Length;
_builder.Append(_rnd.Next(_words));
if (capitalization == Capitalization.AllWords || (position == 0 && capitalization == Capitalization.FirstWord))
{
_builder[position] = char.ToUpper(_builder[position]);
}
if (wordCount > 0)
{
_builder.Append(' ');
}
}
return _builder.ToString();
}
/// <summary>
/// Enumerates the Words property.
/// </summary>
/// <returns>The enumerator.</returns>
public IEnumerator<string> GetEnumerator()
{
return LoremIpsum.Words.GetEnumerator();
}
/// <summary>
/// Enumerates the Words property.
/// </summary>
/// <returns>The enumerator.</returns>
IEnumerator IEnumerable.GetEnumerator()
{
return LoremIpsum.Words.GetEnumerator();
}
/// <summary>
/// Reads the lorem ipsum sentences. Supplies some data in case reading fails, which
/// it will do at design time.
/// </summary>
private static void EnsureSentences()
{
if (_sentences == null)
{
_sentences = new List<string>();
StreamResourceInfo info = Application.GetResourceStream(new Uri("Data/LoremIpsum.txt", UriKind.Relative));
if (info != null)
{
Stream stream = info.Stream;
if (stream != null)
{
using (StreamReader reader = new StreamReader(stream))
{
while (!reader.EndOfStream)
{
_sentences.Add(reader.ReadLine());
}
};
}
}
if (_sentences.Count == 0)
{
_sentences.Add("Lorem ipsum dolor sit amet, consectetuer adipiscing elit.");
_sentences.Add("Maecenas porttitor congue massa.");
_sentences.Add("Fusce posuere, magna sed pulvinar ultricies, purus lectus malesuada libero, sit amet commodo magna eros quis urna.");
_sentences.Add("Nunc viverra imperdiet enim.");
_sentences.Add("Fusce est.");
}
}
}
/// <summary>
/// Creates an alphabetized list of the words from the lorem ipsum text.
/// </summary>
private static void EnsureWords()
{
char[] separators = { ' ', ',', '.' };
EnsureSentences();
if (_words == null)
{
Dictionary<string, object> temp = new Dictionary<string, object>();
foreach (string sentence in _sentences)
{
string[] words = sentence.Split(separators, StringSplitOptions.RemoveEmptyEntries);
foreach (string word in words)
{
temp[word.ToLower()] = null;
}
}
_words = new List<string>(temp.Keys);
_words.Sort();
}
}
}
}