Windows 8 Windows 8/Metro用户界面中文本框下的自动完成框

Windows 8 Windows 8/Metro用户界面中文本框下的自动完成框,windows-8,microsoft-metro,winrt-xaml,Windows 8,Microsoft Metro,Winrt Xaml,我想使用C#/XAML在Windows8UI/Metro UI应用程序的文本框上实现自动完成 此时,当软/触摸键盘显示时,它会遮挡自动完成框。但是,在文本框焦点上,Windows 8会自动向上滚动整个视图,并确保文本框处于焦点位置 事实上,我只想让视图再向上滚动一点(事实上,是自动完成框的高度) 我意识到我可以截获InputPane.GetForCurrentView()的显示事件 我可以在显示事件中将InputPaneVisibilityEventArgs.EnsureredFocuseDel

我想使用C#/XAML在Windows8UI/Metro UI应用程序的文本框上实现自动完成

此时,当软/触摸键盘显示时,它会遮挡自动完成框。但是,在文本框焦点上,Windows 8会自动向上滚动整个视图,并确保文本框处于焦点位置

事实上,我只想让视图再向上滚动一点(事实上,是自动完成框的高度)

我意识到我可以截获InputPane.GetForCurrentView()的显示事件

我可以在显示事件中将InputPaneVisibilityEventArgs.EnsureredFocuseDelementInview设置为true(这样Windows就不会尝试做任何事情了)。。。。但是,我如何调用与Windows 8相同的滚动功能,但要求它再滚动一点

以下是主页的代码:

    <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
    <StackPanel VerticalAlignment="Center" HorizontalAlignment="Center" Margin="0,200,0,0">
        <TextBlock HorizontalAlignment="Center" FontSize="60">App 1</TextBlock>
        <TextBlock HorizontalAlignment="Center">Enter text below</TextBlock>
        <TextBox HorizontalAlignment="Center" Margin="-10,0,10,0" Width="400" Height="30"/>
        <ListBox HorizontalAlignment="Center" Width="400">
            <ListBoxItem>Auto complete item 1</ListBoxItem>
            <ListBoxItem>Auto complete item 2</ListBoxItem>
            <ListBoxItem>Auto complete item 3</ListBoxItem>
            <ListBoxItem>Auto complete item 4</ListBoxItem>
            <ListBoxItem>Auto complete item 5</ListBoxItem>
        </ListBox>
    </StackPanel>
</Grid>

应用程序1
在下面输入文本
自动完成项目1
自动完成项目2
自动完成项目3
自动完成项目4
自动完成项目5
如果你以最低分辨率启动模拟器,用手“触摸”文本框,这将打开软键盘。在real应用程序中,当用户输入文本时,自动完成列表将显示项目

简而言之,我怎样才能将屏幕向上移动一点,让用户可以看到整个自动完成列表

请记住,在真正的应用程序中,情况会更糟,因为用户甚至可能没有注意到自动完成列表显示在键盘的“下方”


我真的很想得到一些建议,非常感谢

好的,下面是我如何解决这个问题的,因为我似乎找不到任何方法根据键盘的外观来控制应用程序的滚动。我将创建一个用户控件,它将构成自动完成文本框的基础

<UserControl
x:Class="App6.MyUserControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:App6"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="300"
d:DesignWidth="400">

<Grid>
    <TextBox x:Name="textBox" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top"  GotFocus="textBox_GotFocus" LostFocus="textBox_LostFocus" />
    <ListBox x:Name="listBox" Height="150"  Margin="0,-150,0,0" VerticalAlignment="Top" Visibility="Collapsed"/>
</Grid>

这是一个难以置信的基本实现,因此您必须进行调整以满足您的需求

然后,我将向用户控件添加以下代码

public sealed partial class MyUserControl1 : UserControl
{
    // Rect occludedRect;
    bool hasFocus = false;

    public MyUserControl1()
    {
        this.InitializeComponent();
        InputPane.GetForCurrentView().Showing += MyUserControl1_Showing;
    }

    void MyUserControl1_Showing(InputPane sender, InputPaneVisibilityEventArgs args)
    {
        if (hasFocus)
        {
            var occludedRect = args.OccludedRect;

            var element = textBox.TransformToVisual(null);
            var point = element.TransformPoint(new Point(0, 0));

            if (occludedRect.Top < point.Y + textBox.ActualHeight + listBox.ActualHeight)
            {
                listBox.Margin = new Thickness(0, -listBox.ActualHeight, 0, 0);         // Draw above     
            }
            else
            {
                listBox.Margin = new Thickness(0, textBox.ActualHeight, 0, 0); // draw below
            }
        }          
    }

    private void textBox_GotFocus(object sender, RoutedEventArgs e)
    {
        listBox.Visibility = Windows.UI.Xaml.Visibility.Visible;
        hasFocus = true;
    }

    private void textBox_LostFocus(object sender, RoutedEventArgs e)
    {
        listBox.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
        hasFocus = false;
    }        
}
公共密封部分类MyUserControl1:UserControl
{
//直肌闭塞直肌;
bool hasFocus=false;
公共MyUserControl1()
{
this.InitializeComponent();
InputPane.GetForCurrentView().Showing+=MyUserControl1\u Showing;
}
无效MyUserControl1_显示(InputPane发送方、InputPaneVisibilityEventArgs)
{
如果(hasFocus)
{
var occludedRect=args.occludedRect;
var元素=textBox.TransformToVisual(null);
var point=element.TransformPoint(新点(0,0));
if(occludedRect.Top

接下来的步骤是公开属性,以传递要绑定到ListBox的数据。核心将是ListBoxItem模板和更多,这取决于您希望它的可重用性。

好的,我将如何解决这个问题,因为我似乎找不到任何方法根据键盘的外观来控制应用程序的滚动。我将创建一个用户控件,它将构成自动完成文本框的基础

<UserControl
x:Class="App6.MyUserControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:App6"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="300"
d:DesignWidth="400">

<Grid>
    <TextBox x:Name="textBox" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top"  GotFocus="textBox_GotFocus" LostFocus="textBox_LostFocus" />
    <ListBox x:Name="listBox" Height="150"  Margin="0,-150,0,0" VerticalAlignment="Top" Visibility="Collapsed"/>
</Grid>

这是一个难以置信的基本实现,因此您必须进行调整以满足您的需求

然后,我将向用户控件添加以下代码

public sealed partial class MyUserControl1 : UserControl
{
    // Rect occludedRect;
    bool hasFocus = false;

    public MyUserControl1()
    {
        this.InitializeComponent();
        InputPane.GetForCurrentView().Showing += MyUserControl1_Showing;
    }

    void MyUserControl1_Showing(InputPane sender, InputPaneVisibilityEventArgs args)
    {
        if (hasFocus)
        {
            var occludedRect = args.OccludedRect;

            var element = textBox.TransformToVisual(null);
            var point = element.TransformPoint(new Point(0, 0));

            if (occludedRect.Top < point.Y + textBox.ActualHeight + listBox.ActualHeight)
            {
                listBox.Margin = new Thickness(0, -listBox.ActualHeight, 0, 0);         // Draw above     
            }
            else
            {
                listBox.Margin = new Thickness(0, textBox.ActualHeight, 0, 0); // draw below
            }
        }          
    }

    private void textBox_GotFocus(object sender, RoutedEventArgs e)
    {
        listBox.Visibility = Windows.UI.Xaml.Visibility.Visible;
        hasFocus = true;
    }

    private void textBox_LostFocus(object sender, RoutedEventArgs e)
    {
        listBox.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
        hasFocus = false;
    }        
}
公共密封部分类MyUserControl1:UserControl
{
//直肌闭塞直肌;
bool hasFocus=false;
公共MyUserControl1()
{
this.InitializeComponent();
InputPane.GetForCurrentView().Showing+=MyUserControl1\u Showing;
}
无效MyUserControl1_显示(InputPane发送方、InputPaneVisibilityEventArgs)
{
如果(hasFocus)
{
var occludedRect=args.occludedRect;
var元素=textBox.TransformToVisual(null);
var point=element.TransformPoint(新点(0,0));
if(occludedRect.Top

接下来的步骤是公开属性,以传递要绑定到ListBox的数据。核心将是ListBoxItem模板和更多,具体取决于您希望它的可重用性。

我已经为Windows应用商店应用创建了一个自动完成框,nuget软件包可在

上找到。我已经为Windows应用商店应用创建了一个自动完成框,nuget软件包可以在

上找到,你能发布一些代码让我试着复制它吗?:)好的,我添加了代码。谢谢我一直在寻找AutoCompleteBox有一段时间了,如果你能让它工作的话,你能分享一下吗?你能发布一些c吗