Mürekkep Blogu Web Örneği
Mürekkep Blogu örnek uygulaması, mürekkep oluşturma yeteneğine sahip ve Microsoft Internet Explorer'da bu denetimi barındıran yönetilen bir UserControl sınıfının nasıl oluşturulacağını gösterir. Örnek ayrıca HTTP kullanarak bir ağda mürekkep verileri göndermeye ve bir sunucuda mürekkep kalıcı hale getirmek için tek bir teknik gösterir.
Not
Bu örneği çalıştırmak için ASP.NET yüklü Microsoft Internet Information Services (IIS) olmalıdır. Bilgisayarınızın, ASP.NET uygulamalarının bilgisayarınızda çalışması için gereken gereksinimleri karşıladığından emin olun.
Not
Bu örneği, Microsoft Windows XP Tablet PC Edition Development Kit 1.7 yüklü tablet olmayan bir bilgisayarda çalıştırırsanız mürekkep başlığı için metin tanıma özelliği çalışmaz. Bunun nedeni, Tablet PC SDK 1.7 yüklü Tablet PC olmayan bir bilgisayarda tanıyıcı olmamasıdır. Uygulamanın geri kalanı açıklandığı gibi performans gösterir.
Genel bakış
Mürekkep Blogu örneği, mürekkep özellikli bir Web günlüğü oluşturur. InkBlogWeb ASP.NET bir uygulamadır. Mürekkep girişi, ASP.NET sayfasından başvuruda bulunan bir kullanıcı denetimi aracılığıyla gerçekleştirilir.
Kullanıcı denetimi, Tablet PC platform bileşenlerinin istemci bilgisayarda yüklü olup olmadığını algılar. Bu durumda, kullanıcı denetimi kullanıcıya Web sayfasında iki mürekkep etkin alan sunar: biri blog girdisi için bir başlık oluşturmak ve diğeri girişin gövdesi için. Tablet PC Platformu bileşenleri yüklü değilse, kullanıcıya girişin başlığı ve gövdesi için standart bir metin kutusu denetimi verilir.
Kullanıcı girdiyi oluşturmayı tamamladığında, blog ekle düğmesine tıklar ve gönderi depolama için Web sunucusuna gönderilir. Uygulama sunucuda başlık metnini ve gönderme tarihini ve grafik değişim biçimi (GIF) dosyasına başvuruyu kaydeder. Sunucuya da kaydedilen GIF dosyası, gövdeden gelen mürekkep verilerini güçlendirilmiş bir GIF dosyasında içerir. Daha fazla bilgi için geliştirilmiş GIF biçimi hakkında bkz. HTML'de Mürekkep Depolama.
InkBlog çözümünde iki proje vardır: InkBlogControls projesi ve InkBlogWeb projesi.
InkBlogControls Projesi
InkBlogControls projesi, Web sayfasında mürekkep oluşturmayı etkinleştiren kullanıcı denetiminin kodunu içeren bir UserControl projesidir. Bu denetimin kodu olan InkArea denetimi InkArea.cs dosyasındadır.
InkArea
Sınıfı, UserControl sınıfından devralır.
InkArea
kontrolü için oluşturucu, CreateInkCollectionSurface
adlı bir yardımcı yöntemi çağırır.
public InkArea()
{
// Standard template code
try
{
inputArea = CreateInkCollectionSurface();
}
catch (FileNotFoundException)
{
inputArea = new TextBox();
((TextBox)inputArea).Multiline = true;
}
inputArea.Size = this.Size;
// Add the control used for collecting blog input
this.Controls.Add(inputArea);
}
CreateInkCollectionSurface
yöntemi, InkCollector sınıfının bir örneğini oluşturmaya çalışarak Tablet PC mürekkep oluşturma bileşenlerinin istemcide kullanılabilir olup olmadığını belirler.
CreateInkCollectionSurface
yöntemine yapılan çağrı başarılı olursa, yöntem denetim olarak bir Panel nesnesi döndürür.
protected Control CreateInkCollectionSurface()
{
try
{
Panel inkPanel = new Panel();
inkPanel.BorderStyle = BorderStyle.Fixed3D;
inkCollector = new InkCollector(inkPanel);
((InkCollector)inkCollector).Enabled = true;
return inkPanel;
}
catch
{
throw;
}
}
Mürekkep oluşturma platformu dosyaları bulunamadığından oluşturucu başarısız olursa, InputArea
denetimi InkCollector denetimi yerine TextBox denetimi olarak oluşturulur. Oluşturucu daha sonra denetimi üst kullanıcı denetiminin boyutuna boyutlandırıp üst kullanıcının Denetimler koleksiyonuna ekler.
InkArea denetim sınıfı üç ilginç genel özellik uygular: InkData, TextData ve WebEnabled.
InkData özelliği salt okunurdur ve istemci mürekkeplemeyi destekliyorsa, seri hale getirilmiş mürekkep verilerine erişim sağlar. İstemci mürekkep oluşturma özelliğini desteklemiyorsa, InkData özelliği boş bir dize alır. InkData özelliği, istemcinin mürekkep oluşturmayı desteklenip desteklemediğini belirlemek için SerializeInkData yardımcı yöntemini çağırır.
protected String SerializeInkData()
{
Debug.Assert(InkEnabled, null, "Client must be ink-enabled");
// Obtain the ink associated with this control
Ink ink = ((InkCollector)inkCollector).Ink;
// Serialize the ink
if (ink.Strokes.Count > 0)
{
byte[] inkDataBytes = ink.Save(PersistenceFormat.Gif);
return Convert.ToBase64String(inkDataBytes);
}
// Default to returning the empty string.
return String.Empty;
}
SerializeInkData
yönteminde, Ink nesnesi elde edilirken InkCollector'a dönüştürme işlemi gereklidir çünkü inputArea
Denetimolarak bildirilir. Mürekkep nesnesi herhangi bir vuruş içeriyorsa, mürekkep verileri inkDataBytes
bayt dizisine GIF olarak kaydedilir (PersistenceFormat numaralandırma değeri kullanılarak belirtilir). Yöntemi daha sonra bayt dizisini Base64 ile kodlanmış bir dizeye dönüştürür ve bu dizeyi döndürür.
İstemcinin tanıma işlemini gerçekleştirebildiği varsayıldığında, TextData
özelliği, mürekkep verilerini bir el yazısı tanıyıcıya aktarıp işleyerek elde edilen RecognitionResult nesnesini döndürür. İstemci mürekkep farkında değilse, metin kutusu içeriği aşağıdaki kodda gösterildiği gibi döndürülür.
public string TextData
{
get
{
if (this.WebEnabled)
{
return RecognizeInkData();
}
else
{
return ((TextBox)inputArea).Text;
}
}
}
TextData
özelliği, tanımayı gerçekleştirmek için aşağıdaki kodda gösterilen RecognizeInkData
yardımcı yöntemini çağırır. Tanıma altyapıları sistemde mevcut olduğunda, RecognizeInkData
yöntemi RecognitionResult nesnesinin TopString özelliğini içeren bir dize döndürür. Aksi takdirde boş bir string döndürür.
protected String RecognizeInkData()
{
// Obtain the ink associated with this control
Ink ink = ((InkCollector)inkCollector).Ink;
if (ink.Strokes.Count > 0)
{
// Attempt to create a recognition context and use it to
// retrieve the top alternate.
try
{
RecognizerContext recognizerContext = new RecognizerContext();
RecognitionStatus recognitionStatus;
recognizerContext.Strokes = ink.Strokes;
RecognitionResult recognitionResult = recognizerContext.Recognize(out recognitionStatus);
if (recognitionStatus == RecognitionStatus.NoError) && ( null != recognitionResult) )
{
return recognitionResult.TopString;
}
}
catch (Exception)
{
// An exception will occur if the client does not have
// any handwriting recognizers installed on their system.
// In this case, we default to returning an empty string.
}
}
return String.Empty;
}
InkEnabled
özelliği, istemci makinede mürekkep kullanımının desteklenip desteklenmediğini gösteren salt okunur bir Boole değeridir.
InkArea
denetim sınıfının bir diğer önemli genel üyesi de DisposeResources
yöntemidir. Bu yöntem, kullanıcı denetimi tarafından yararlanılan tüm kaynakların temizlendiğinden emin olmak için dahili olarak Dispose
yöntemini çağırır.
InkArea
denetimini kullanan tüm uygulamalar, denetimi kullanmayı bitirdiğinde DisposeResources
yöntemini çağırmalıdır.
InkBlogWeb Projesi
InkBlogWeb projesi, blog işlevselliği sağlamak için InkArea
denetimine başvuran bir Web Kurulumu dağıtım projesidir. Web Kurulumu dağıtım projeleri hakkında daha fazla bilgi için bkz. Web Kurulumu Projesi'nin Dağıtımı.
Blog örneğini uygulayan iki .aspx dosyası vardır: Default.aspx ve AddBlog.aspx. Default.aspx, InkBlogWeb uygulamasının varsayılan sayfasıdır. Bu sayfanın arkasındaki kod dosyası Default.aspx.cs. Bu sayfa, yeni blog giriş formunu içeren sayfaya bir bağlantı sağlar ve mevcut blog girdilerini görüntüler. Bu işlem, AddBlog.aspx adlı yeni blog giriş formu sayfasının aşağıdaki incelemesinden sonra açıklanmaktadır.
AddBlog.aspx ve arka planda kod dosyası olan AddBlog.aspx.cs, yeni blog girdileri oluşturmaya yönelik mantık ve kullanıcı arabirimi kodunu içerir. AddBlox.aspx, aşağıdaki örnekte gösterildiği gibi HTML OBJECT öğesini kullanarak InkBlogControls projesinde oluşturulan InkArea denetim sınıfının iki örneğine başvurur. Örneğin birinde inkBlogTitle id
özniteliği, diğerinde de inkBlogBody kimlik özniteliği vardır.
<OBJECT id="inkBlogTitle" classid="InkBlogControls.dll#InkBlog.InkArea" width="400" height="48" VIEWASTEXT>``</OBJECT>``<br/>``<OBJECT id="inkBlogBody" classid="InkBlogControls.dll#InkBlog.InkArea" width="400" height="296" VIEWASTEXT>``</OBJECT>
InkBlogControls.dll derlemesi, başvuruda bulunan .aspx sayfasıyla aynı dizinde bulunmalıdır. Web Kurulumu dağıtım projesi, bu durumun söz konusu olmasını sağlar; bu, Dağıtım Projesi'nde "InkBlogControls'ten birincil çıktı" öğesinin bulunmasıyla doğrulanmaktadır.
Başlık denetimi, başlık için tek bir mürekkep satırının girişini kolaylaştırmak için yalnızca 48 piksel yüksekliğindedir. Gövde kontrolü, birden çok satırdan oluşan daha büyük blog girişleri veya belki de çizimler için alan sağlamak amacıyla 296 piksel yüksekliğindedir.
InkArea denetimleri, standart HTML BUTTON öğesinin onclick olay işleyicisi aracılığıyla bir istemci taraflı betik işlevi olan AddBlog'a bağlanır.
<button id="BUTTON1" type="button" onclick="AddBlog()">Add Blog</button>
Sayfada üç gizli INPUT öğesi içeren bir HTML formu da vardır: BlogTitleText, BlogBodyText ve BlogBodyInkData. Bu form, blog giriş verilerini sunucuya geri göndermek için kullanılır. AddBlog.aspx, form için tanımlanan geri gönderme işleyicisidir.
Microsoft JScript'te yazılan AddBlog işlevi<entity type="reg"/>- InkArea denetimlerinden blog verilerini ayıklar ve sonuçları sunucuya gönderir.
function AddBlog()
{
// Extract the blog's title data as ink and text
form.BlogTitleText.value = inkBlogTitle.TextData;
// Extract the blog's body data as ink and text
form.BlogBodyText.value = inkBlogBody.TextData;
form.BlogBodyInkData.value = inkBlogBody.InkData;
form.submit();
}
Veriler sunucuya ulaştığında, AddBlog.aspx.cs içindeki kod httpRequest nesnesinin Form özelliğinin herhangi bir veri içerip içermediğini görmek için Page_Load olay işleyicisini denetler. Bu durumda, geçerli sistem saatini temel alan bir dosya adı oluşturur, form verilerini üç dize değişkenine yerleştirir ve aşağıdaki kodda gösterildiği gibi verileri bir HTML dosyasına ve varsa mürekkep verilerini içeren bir GIF dosyasına yazar.
if ( (String.Empty != inkBody) )
{
// Use helper method to create a GIF image file from ink data
CreateGif(imagePath, fileName, inkBody);
// Create an HTML fragment to reference the image file
content = "<img src=\"Blogs/Images/" + fileName + ".gif\"></img>";
}
else
{
// If no ink data is available create an HTML fragment that contains
// the blog's text directly.
content = "<P>" + textBody + "</P>";
}
// Use helper method to create the blog web page on the server
CreateHtm(blogPath, fileName, blogTitle, content);
Yardımcı yöntemler hakkında daha fazla ayrıntı için örnek kaynak koduna bakın.
Örneği Çalıştırma
Tablet PC SDK 1.7, Mürekkep Blogu Web örneğini varsayılan olarak yükler. Örneği çalıştırmak için Internet Explorer'da https://localhost/TabletPCSDK_WebSamples/InkBlogWeb/Default.aspx. konumuna gidin. Windows Server 2003 çalıştırıyorsanız, bilgisayarınızın adını "localhost" olarak değiştirin.
Not
Derlenen web örnekleri, SDK için varsayılan yükleme seçeneği tarafından yüklenmez. Özel bir yüklemeyi tamamlamanız ve bunları yüklemek için "Önceden derlenmiş Web Örnekleri" alt seçeneğini belirlemeniz gerekir.
Ayrıca projeyi Microsoft Visual Studio<entity type="reg"/> .NET'te açıp oluşturarak ve ardından IIS çalıştıran ayrı bir bilgisayara dağıtarak da çalıştırabilirsiniz.
Örnekle ilgili sorunları giderme
Örneği çalıştırırken veya barındırırken zorluk yaratabilecek üç alan izinler ve tanımadır.
İzinler
Örnek, yeni bir blog girdisi oluşturmaya çalışan hesap için sanal kök klasör içinde yazma izinleri gerektirir. Varsayılan olarak, Tablet PC SDK 1.7'de sağlanan örneğin derlenmiş sürümü bu gereksinimi karşılayacak şekilde ayarlanmış doğru izinlere sahiptir.
Sağlanan Web Kurulumu dağıtım projesini kullanarak örneği derleyip dağıtırsanız, %MACHINENAME%\Users grubuna InkBlogWeb sanal kökü tarafından işaret edilen dosya sistemi klasörüne yazma erişimi vermeniz gerekir (örneğin, C:\InetPub\WWWRoot\InkBlogWeb). Kullanıcılar grubu IIS tarafından kullanılan Anonim hesabı içerir ve böylece ASP.NET uygulamasının yeni blog girdilerini dosya sistemine yazmasına olanak sağlar. Alternatif olarak sanal köke anonim erişimi kaldırabilir ve kimlik doğrulamasını zorlayabilirsiniz.
Tanıma
Blog başlığındaki mürekkepleri tanımak için el yazısı tanıyıcıların yüklenmesi gerekir. InkBlog uygulamasına Windows XP Tablet PC Edition dışında bir işletim sistemi olan ancak Tablet PC SDK 1.7 yüklü olan bir bilgisayardan erişirseniz, InkArea denetimlerinde mürekkeple yazabilirsiniz, ancak tanıma altyapıları mevcut olmaz ve blog girdileriniz için başlık gösterilmez. Ancak gövdedeki mürekkep içeriği hala görünür durumda.
Makine Yapılandırması
ASP.NET ve .NET Framework'ü bir bilgisayara yüklediyseniz ve ardından IIS'yi kaldırıp yeniden yüklerseniz, betik eşlemeleri bozulacak ve ASP.NET çalışmaz. Böyle bir durumda, ASP.NET IIS Kayıt aracıyla (Aspnet_regiis.exe -i) ASP.NET betik eşlemelerini onarabilirsiniz.
İlgili konular