none
在ScrollViewer中的TextBox虚拟键盘无法自动收起 RRS feed

  • 问题

  • 代码如下:

        <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
            <ScrollViewer >
                <StackPanel Width="2000"  Orientation="Horizontal">
                    <StackPanel Width="100" Background="Red">
    
                    </StackPanel>
                    <StackPanel Width="600" Background="Green">
                        <TextBox Height="182"></TextBox>
                    </StackPanel>
                </StackPanel>
            </ScrollViewer>
        </Grid>
    TextBox在Pad上点击时,虚拟键盘会自动弹出,但是当编辑完成后,点击其他区域,虚拟键盘无法收起。请问如何解决这个问题。

    2012年8月15日 14:25

答案

  • 使用你的方法还是有问题,我在你的基础上做了一些改进,就可以了

    private void ScrollViewer_Tapped_1(object sender, TappedRoutedEventArgs e)
    {
    	ComboBox comboBox = DependencyObjectExtensions.GetVisualParent<ComboBox>((DependencyObject)e.OriginalSource);
    	if (comboBox != null) return;
    
    	btnUsedToForceKeyboardHide.Focus(Windows.UI.Xaml.FocusState.Keyboard);
    }
    
    public static class DependencyObjectExtensions
    {
    	public static T GetVisualParent<T>(this  DependencyObject child) where T : UIElement
    	{
    		while ((child != null) && !(child is T))
    		{
    			child = VisualTreeHelper.GetParent(child);
    		}
    		return child as T;
    	}
    }


    • 已标记为答案 hoist1999 2012年9月4日 9:35
    2012年9月4日 9:34

全部回复

  • 因为你的布局中没有其他可以接受焦点的组件,所以焦点依旧在TextBox上,即使你点击了布局的其他地方。布局元素是不接受输入焦点的。

    你在其中随意放一个 Button 或者 其他可以接受焦点的控件,点击其既可以收缩虚拟键盘。或者 和这个帖子一样 http://social.msdn.microsoft.com/Forums/zh-cn/metroappzhcn/thread/6a2f28cf-2e05-4613-95eb-9cf9c95fbc4a 放一个大小为0的可接受焦点控件,在你点击其他地方时候,让其获得焦点既可。


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us


    2012年8月16日 4:08
    版主
  • 我试了你说的方案,ScrollViewer_Tapped事件中使用如下的代码将焦点转移到一个button上,但是新的问题出来了,就是和界面中的comboBox发生冲突,comboBox随机且频繁地出现无法弹出的问题。请问这该怎么处理呢?

    private void ScrollViewer_Tapped_1(object sender, TappedRoutedEventArgs e)
    {
    	btnUsedToForceKeyboardHide.Focus(Windows.UI.Xaml.FocusState.Keyboard);
    }

    2012年8月20日 1:15
  • 因为你在ComboBox Tap之后,路由事件同时也会将事件路由到她的父控件触发 ScrollViewer_Tapped。 这样你可以在 ScrollViewer_Tapped 中判断是谁为原始触发源:

            private void ScrollViewer_Tapped_1(object sender, TappedRoutedEventArgs e)
            {
                foreach (UIElement element in VisualTreeHelper.FindElementsInHostCoordinates(e.GetPosition(sender as UIElement), sender as UIElement))
                {
                    if (element is ComboBox) return;
                }
                btnUsedToForceKeyboardHide.Focus(Windows.UI.Xaml.FocusState.Keyboard);
            }


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    • 已标记为答案 hoist1999 2012年8月21日 0:50
    • 取消答案标记 hoist1999 2012年9月4日 9:33
    2012年8月20日 7:56
    版主
  • 问题已解决,谢谢Bob Bao!
    2012年8月21日 0:50
  • 使用你的方法还是有问题,我在你的基础上做了一些改进,就可以了

    private void ScrollViewer_Tapped_1(object sender, TappedRoutedEventArgs e)
    {
    	ComboBox comboBox = DependencyObjectExtensions.GetVisualParent<ComboBox>((DependencyObject)e.OriginalSource);
    	if (comboBox != null) return;
    
    	btnUsedToForceKeyboardHide.Focus(Windows.UI.Xaml.FocusState.Keyboard);
    }
    
    public static class DependencyObjectExtensions
    {
    	public static T GetVisualParent<T>(this  DependencyObject child) where T : UIElement
    	{
    		while ((child != null) && !(child is T))
    		{
    			child = VisualTreeHelper.GetParent(child);
    		}
    		return child as T;
    	}
    }


    • 已标记为答案 hoist1999 2012年9月4日 9:35
    2012年9月4日 9:34