Как заставить AutoSuggestBox разрешать только «принятый» текст, выбранный из ItemsSource? - PullRequest
0 голосов
/ 06 мая 2018

Я пытаюсь запретить CS / UWP AutoSuggestionBox иметь текст в поле при отправленном поиске, который не был найден в списке ItemsSource. Если Поиск не найден, я хочу, чтобы фокус ввода был невозможен для удаления из AutoSuggestionBox до тех пор, пока проблема не будет устранена путем выбора допустимой записи из списка ItemsSource или путем автоматического выбора ближайшего совпадения в списке, или пользователем нажав на «х», чтобы очистить поиск. Только до тех пор, пока эти условия не будут выполнены, фокус будет удален из AutoSuggestionBox.

Вот Эффект, к которому я иду. Это клип ComboBox из базы данных Access:

Combobox with autocompletion

Обратите внимание, что он автоматически выбирает наиболее близкое совпадение в списке, прокручивает его и завершает текст после курсора, используя совпадение ...

Любые идеи о том, как сделать это или что-то подобное, используя AutoSuggestionBox?

1 Ответ

0 голосов
/ 06 мая 2018

Альтернативное решение, всплывающее окно Диалоговое окно для создания аналогичной функции. XAML следующим образом:

<ContentDialog ...
    x:Class="MyApp1.ContentDialog1"
    x:Name="A1Dialog"
    Title="MyDialog"
    DefaultButton="Primary"
    PrimaryButtonText="Ok"
    SecondaryButtonText="Cancel"
    Loaded="ContentDialog_Loaded"
    PrimaryButtonClick="ContentDialog_PrimaryButtonClick"
    SecondaryButtonClick="ContentDialog_SecondaryButtonClick">

<Grid Name="A1Grid" 
      Height="{Binding ElementName=A1Dialog, Path=ActualHeight}">
    <Grid.RowDefinitions>
        <RowDefinition Height="auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>

    <TextBox Name="A1TextBox" Grid.Row="0" 
         PlaceholderText="Search String" 
         TextChanged="A1TextBox_TextChanged"/>

    <ScrollViewer Grid.Row="1"
       ScrollViewer.VerticalScrollBarVisibility="Auto"
       VerticalAlignment="Stretch">
        <ListBox Name="A1ListBox" MinHeight="200"/>
    </ScrollViewer>

    </Grid>
</ContentDialog>

C # Поддержка XAML следующим образом:

using System;
using System.Linq;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using System.Collections.Generic;

public sealed partial class ContentDialog1 : ContentDialog
{
    List<string> Choices = new List<string>
    {
            "One", "Two", "Three", "Four",
            "Five", "Six", "Seven", "Eight",
            "Nine", "Ten", "Eleven", "Twelve",
            "13", "14", "15", "16",
            "17", "18", "19",
            "20"
    };

    public ContentDialog1()
    {
        this.InitializeComponent();
        A1ListBox.ItemsSource = Choices;
        this.IsPrimaryButtonEnabled = false;
    }

    private void A1TextBox_TextChanged(
        object sender, 
        TextChangedEventArgs e)
    {
        this.IsPrimaryButtonEnabled = false;
        string text = A1TextBox.Text;
        if (string.IsNullOrEmpty(text))
        {
            A1ListBox.ItemsSource = Choices;
        }
        else
        {
            string search = text.ToLower();
            List<string> list = Choices.Where(
                    x => x.ToLower().Contains(search))
                    .ToList();

            A1ListBox.ItemsSource = list;
            if (list.Count != 0)
            {
                this.IsPrimaryButtonEnabled = true;
                A1ListBox.SelectedIndex = 0;
            }
        }

    }

    // OK Button
    private void ContentDialog_PrimaryButtonClick(
         ContentDialog sender, 
         ContentDialogButtonClickEventArgs args)
    {
    }

    // Cancel Button
    private void ContentDialog_SecondaryButtonClick(
          ContentDialog sender, 
          ContentDialogButtonClickEventArgs args)
    {
    }

    private void ContentDialog_Loaded(object sender, RoutedEventArgs e)
    {
    }

}

Из метода открытия DialogBox:

async void Click(sender s, …) {
    var D = new ContentDialog1();
    ContentDialogResult Result = await D.ShowAsync();
    switch(Result) {
        // Ok Button
        case ContentDialogResult.Primary:
            // this might require a little bit of fixing
            // to save result in public variable...
            // because A1ListBox is not public visible...
            // but the idea is similar...
            var SelectedItem = D.A1ListBox.SelectedItem;
            DoSomethingOk();
            break;
        // Cancel Button
        case ContentDialogResult.Seconday:
            DoSomethingCancel();
            break;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...