2012-08-27 21 views
15

C# içinde Windows 8 için uygulamamı geliştiriyorum ve bir çok can sıkıcı şey, tüm metin kutuları odaklanmasına rağmen dokunmatik klavye bazen ekranda kalır olmasıdır.Windows 8 - Dokunmatik Klavye Nasıl Engellenir?

keyboard dismissal logic white paper numaralı makaleyi okudum. Bu, denetimden denetime geçiş yaparken, klavyenin bir klavye girişini kabul etmese bile açık kalabileceğini açıklar. Bu benim durumum olurdu, çünkü tüm içeriklerim GridView veya ListView'de barındırılıyor. Kullanıcı ekrandaki herhangi bir öğeye tıkladığında, bu kontrollere hafifçe dokunulur. Bu çok can sıkıcı çünkü klavye bir ekranın yarısını alıyor ve klavyeyi kapatmak için bir yol yok.

Devre dışı bırakılacak metin kutusunu ayarlamayı denedim ve etkilemedi. Klavyeyi çıkarmanın tek yolu, odağı son derece hacky olan bir düğmeye ayarlamaktır.

"AutomationPeer" ile bir şeyler yapmam gerektiğini düşündüm, ama tam olarak ne yapacağımı açıklamıyorum. Bu davranışı geçersiz kılacak bir yol var mı?

Düzenleme: Bunu çözdüm. Amaç, whitepaper'da listelenmeyen GridView ve GridView öğelerinin kontrol türüne geçmek.

public class KeyboardUnfocusableGridView : GridView 
{ 
    private class KeyboardUnfocusableGridViewAutomationPeer : GridViewAutomationPeer 
    { 
     public KeyboardUnfocusableGridViewAutomationPeer(GridView owner) 
      : base(owner) 
     { 
     } 

     protected override AutomationControlType GetAutomationControlTypeCore() 
     { 
      return AutomationControlType.Custom; 
     } 

    } 

    private class KeyboardUnfocusableGridViewItemAutomationPeer : GridViewItemAutomationPeer 
    { 
     public KeyboardUnfocusableGridViewItemAutomationPeer(GridViewItem owner) 
      : base(owner) 
     { } 

     protected override AutomationControlType GetAutomationControlTypeCore() 
     { 
      return AutomationControlType.Custom; 
     } 

    } 

    private class KeyboardUnfocusableGridViewItem : GridViewItem 
    { 
     protected override AutomationPeer OnCreateAutomationPeer() 
     { 
      var baseItem = base.OnCreateAutomationPeer(); 
      return new KeyboardUnfocusableGridViewItemAutomationPeer(this); 
     } 


    } 

    protected override AutomationPeer OnCreateAutomationPeer() 
    { 
     var baseItem = base.OnCreateAutomationPeer(); 
     return new KeyboardUnfocusableGridViewAutomationPeer(this); 
    } 

    protected override Windows.UI.Xaml.DependencyObject GetContainerForItemOverride() 
    { 
     return new KeyboardUnfocusableGridViewItem(); 
    } 
} 

O talihsiz Ben basit bir şey yapmak için bu kadar kod yazmak gerekir: İşte beni Klavyeyi kapatmak için izin yaptım ızgaranın kodudur. Kullanmam gereken ItemsControl'un her biri için bunu yapmam gerektiğinden bu kesinlikle uygun değil.

+0

tüm içeriğinizi bir GridView veya ListView ise, tüm yapmanız gereken IsHitTestVisible özelliğini ayarlanır yanlış ve metin kutuları odak kabul edemez, bu yüzden klavye açılır değil. Maalesef, kaydırma işlemini de kaybedersiniz. Sadece bir FYI ... –

+0

Harika bir çözüm, bu konuda umutsuzdum :). Ve aynı teknik, ListView için de çalışır. –

+0

Lütfen çözümünüzü cevapsız bir listeden alabilmemiz için aşağıda bir cevaba taşıyabilir misiniz? Teşekkürler. –

cevap

3

Yapmanız gereken şey, metin girişini kabul etmeyen herhangi bir kontrole odaklanmaktır. Ancak, kullanıcı klavyeyi el ile gösterdiğinde (TextBox'un odağı aldığı için otomatik olarak gösterilmesinin aksine) klavye açık kalacaktır. Daha fazla bilgi için ekran klavyesi ile ilgili bu gerçekten iyi iş parçacığı

atın:

http://social.msdn.microsoft.com/Forums/pl/winappswithcsharp/thread/3c227262-1d2c-4382-9c50-5b71d2b5d823

+0

Tüm denetimlerim GridView veya ListView içinde olduğu gibi bu işe yaramadı. Varsayılan olarak, GridView veya ListView'daki bir kontrole odaklanmak, klavyeyi kapatmaz. Sanırım bir şekilde anladım, kısa bir süre sonra buraya gönderiyorum. – thisnick

+8

Kısa bir süre sonra tanımlayın – Spiked3

İlgili konular