Auto-complete box under a text box in Windows 8 / Metro UI

后端 未结 2 1565
不思量自难忘°
不思量自难忘° 2021-01-01 08:15

I want to implement auto-complete on a textbox in a Windows 8 UI / Metro UI app using C#/XAML.

At the moment, when the soft / touch keyboard shows, it obscures the a

相关标签:
2条回答
  • I have created an AutoCompleteBox for Windows Store apps, the nuget package is available at https://nuget.org/packages/AutoCompleteBoxWinRT

    0 讨论(0)
  • 2021-01-01 08:46

    Ok, here is how I would tackle this since I cannot seem to find any way to control the scrolling of the app based on the appearance of the keyboard. I would create a user control that would form the basis for the auto-complete textbox.

    <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>
    

    This is an incredibly basic implementation, so you will have to tweak to meet your needs.

    Then, I would add the following code-behind to the user control

    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;
        }        
    }
    

    Next steps would be to expose properties to pass data to be bound to the ListBox. Hard core would be ListBoxItem templating and more, depending on how reusable you wanted it to be.

    0 讨论(0)
提交回复
热议问题