programing

WPF의 자동 완성 텍스트 상자

stoneblock 2023. 4. 14. 21:04

WPF의 자동 완성 텍스트 상자

텍스트 박스를 WPF로 자동 완성할 수 있습니까?

스타일 템플릿을 편집하여 콤보 박스를 사용하고 삼각형을 제거한 샘플을 찾았습니다.

더 좋은 해결책이 있을까요?

WPF Toolkit에는 NuGet을 통해 이용할 수 있는 툴킷이 있습니다.

이 문서에서는 디스크 드라이브 폴더 입력에 따라 런타임에 항목을 자동 제안할 수 있는 텍스트 상자를 만드는 방법을 시연합니다.WPF 자동 완성 폴더 텍스트 상자

또한 재사용 가능한 WPF 자동 완성 텍스트 박스를 보십시오. 매우 유용했습니다.

Nimgoble's는 2015년에 사용한 버전입니다.이 질문이 구글에서 "wpf 자동 완성 텍스트 상자" 목록 맨 위에 있으므로 여기에 넣어야겠다고 생각했습니다.

  1. Visual Studio에 프로젝트용 nuget 패키지 설치

  2. xaml에서 라이브러리에 대한 참조를 추가합니다.
    xmlns:behaviors="clr-namespace:WPFTextBoxAutoComplete;assembly=WPFTextBoxAutoComplete"

  3. 텍스트 상자를 만들고 AutoCompleteBehaviour를 바인딩합니다.List<String>(테스트 항목):
    <TextBox Text="{Binding TestText, UpdateSourceTrigger=PropertyChanged}" behaviors:AutoCompleteBehavior.AutoCompleteItemsSource="{Binding TestItems}" />

IMHO 이것은 위의 다른 옵션보다 시작 및 관리가 훨씬 쉽습니다.

또는 자동 완성 상자를 클릭하여 도구 상자에 추가할 수 있습니다. 그런 다음 항목을 선택하고 WPF 구성 요소로 이동하여 시스템에 있는 자동 완성 상자에 필터를 입력합니다.창문들.네임스페이스를 제어하고 xaml 파일로 드래그합니다.Auto Complete Box는 기본 제어이므로 다른 작업보다 훨씬 쉽습니다.

매우 오래된 질문인 것을 알지만 제가 생각해낸 답변을 덧붙이고 싶습니다.

우선, 통상의 핸들러가 필요합니다.TextChanged이벤트 핸들러TextBox:

private bool InProg;
internal void TBTextChanged(object sender, TextChangedEventArgs e)
            {
            var change = e.Changes.FirstOrDefault();
            if ( !InProg )
                {
                InProg = true;
                var culture = new CultureInfo(CultureInfo.CurrentCulture.Name);
                var source = ( (TextBox)sender );
                    if ( ( ( change.AddedLength - change.RemovedLength ) > 0 || source.Text.Length > 0 ) && !DelKeyPressed )
                        {
                         if ( Files.Where(x => x.IndexOf(source.Text, StringComparison.CurrentCultureIgnoreCase) == 0 ).Count() > 0 )
                            {
                            var _appendtxt = Files.FirstOrDefault(ap => ( culture.CompareInfo.IndexOf(ap, source.Text, CompareOptions.IgnoreCase) == 0 ));
                            _appendtxt = _appendtxt.Remove(0, change.Offset + 1);
                            source.Text += _appendtxt;
                            source.SelectionStart = change.Offset + 1;
                            source.SelectionLength = source.Text.Length;
                            }
                        }
                InProg = false;
                }
            }

그럼 간단하게PreviewKeyDown핸들러:

    private static bool DelKeyPressed;
    internal static void DelPressed(object sender, KeyEventArgs e)
    { if ( e.Key == Key.Back ) { DelKeyPressed = true; } else { DelKeyPressed = false; } }

이 예에서 "파일"은 응용 프로그램 시작 시 작성된 디렉토리 이름 목록입니다.

그런 다음 핸들러를 연결합니다.

public class YourClass
  {
  public YourClass()
    {
    YourTextbox.PreviewKeyDown += DelPressed;
    YourTextbox.TextChanged += TBTextChanged;
    }
  }

이 기능을 통해 사용자가 선택한 모든 것을List자동 완성 상자에 사용됩니다.자동완성에 대한 방대한 목록이 있을 것으로 예상되신다면 이 옵션은 그다지 좋은 옵션이 아닐 수 있지만, 제 앱에서는 20-50개의 항목만 표시되므로 매우 빠르게 순환됩니다.

자동 완료해야 할 값이 적은 경우 xaml에 추가할 수 있습니다.입력하면 자동 완성이 호출되고 드롭다운도 표시됩니다.

<ComboBox Text="{Binding CheckSeconds, UpdateSourceTrigger=PropertyChanged}"
          IsEditable="True">
    <ComboBoxItem Content="60"/>
    <ComboBoxItem Content="120"/>
    <ComboBoxItem Content="180"/>
    <ComboBoxItem Content="300"/>
    <ComboBoxItem Content="900"/>
</ComboBox>

WinForms 텍스트 상자를 사용할 것을 제안하지 않은 이유에 놀랐습니다.

XAML:

     <WindowsFormsHost  Margin="10" Width="70">
        <wf:TextBox x:Name="textbox1"/>
     </WindowsFormsHost>

Winforms 네임스페이스도 잊지 마십시오.

xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"

C#:

     AutoCompleteStringCollection stringCollection = new AutoCompleteStringCollection(){"String 1", "String 2", "etc..."};
   
     textbox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
     textbox1.AutoCompleteSource = AutoCompleteSource.CustomSource;
     textbox1.AutoCompleteCustomSource = stringCollection;

Autocomplete를 사용하면 어떤 이유로 인해 예외가 발생할 수 있으므로 뒤에 있는 Code에서 수행해야 합니다.

WPF 팝업 요소를 textBox와 함께 사용하는 방법은 다음과 같습니다.

XAML 파일

<TextBox x:Name="DocumentType"
    Margin="20"
    KeyUp="DocumentType_KeyUp"
    LostFocus="DocumentType_LostFocus"/>

<Popup x:Name="autoCompletorListPopup"
        Visibility="Collapsed"
        StaysOpen="False"
        AllowsTransparency="True"
        PlacementTarget="{Binding ElementName=DocumentType}"
        Width="150"
        Placement="Bottom">
    <ListBox x:Name="autoCompletorList"
                Background="WhiteSmoke"
                MaxHeight="200"
                Margin="20 0"
                SelectionChanged="autoCompletorList_SelectionChanged"/>
</Popup>

CS 파일

List<string> listDocumentType = new List<string>() {"Pdf File","AVI File","JPEG file","MP3 sound","MP4 Video"} //...

private void autoCompletorList_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    try
    {
        if (autoCompletorList.SelectedItem != null)
        {
            DocumentType.Text = autoCompletorList.SelectedValue.ToString();
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

private void DocumentType_KeyUp(object sender, KeyEventArgs e)
{
    try
    {
        if(e.Key == Key.Enter)
        {
            // change focus or remove focus on this element
            NextElementBox.Focus();
        }
        else
        {
            if (DocumentType.Text.Trim() != "")
            {
                autoCompletorListPopup.IsOpen = true;
                autoCompletorListPopup.Visibility = Visibility.Visible;
                autoCompletorList.ItemsSource = listDocumentType.Where(td => td.Trim().ToLower().Contains(DocumentType.Text.Trim().ToLower()));
            }
            else
            {
                autoCompletorListPopup.IsOpen = false;
                autoCompletorListPopup.Visibility = Visibility.Collapsed;
                autoCompletorList.ItemsSource = null;
            }
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

private void DocumentType_LostFocus(object sender, RoutedEventArgs e)
{
    try
    {
        if (autoCompletorList.SelectedItem != null)
        {
            DocumentType.Text = autoCompletorList.SelectedValue.ToString();
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

언급URL : https://stackoverflow.com/questions/950770/autocomplete-textbox-in-wpf