AutoComplete TextBox in WPF
우선 Visual Studio 2008 에서 WPF 응용프로그램 프로젝트를 생성한다. 프로젝트 이름은 AutoCompleteWPF 라고 정했다.
AutoComplete TextBox 를 테스트 하기 위하여 TextBox 와 ListBox 가 필요하다. 아래와 같이 작성해 주자.

<Window x:Class="AutoCompleteWPF.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="AutoComplete TextBox" Height="281" Width="503">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="40"/>
<RowDefinition Height="203*"/>
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" Text="Type Your Search : " HorizontalAlignment="Left" VerticalAlignment="Bottom"
Width="112" Height="15.92" Margin="31, 0, 0, 4"/>
<TextBox x:Name="tbxAuto" Grid.Row="0" HorizontalAlignment="Right" VerticalAlignment="Bottom"
Height="25" Width="325" Margin="0, 0, 10, 0" TextWrapping="NoWrap"/>
<ListBox x:Name="lbxSuggestion" Grid.Row="1" Background="LightYellow" Visibility="Collapsed"
HorizontalAlignment="Right" VerticalAlignment="Top" Width="325" Margin="0, 0, 10, 0"
SelectionChanged="lbxSuggestion_SelectionChanged"/>
</Grid>
</Window>
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="AutoComplete TextBox" Height="281" Width="503">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="40"/>
<RowDefinition Height="203*"/>
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" Text="Type Your Search : " HorizontalAlignment="Left" VerticalAlignment="Bottom"
Width="112" Height="15.92" Margin="31, 0, 0, 4"/>
<TextBox x:Name="tbxAuto" Grid.Row="0" HorizontalAlignment="Right" VerticalAlignment="Bottom"
Height="25" Width="325" Margin="0, 0, 10, 0" TextWrapping="NoWrap"/>
<ListBox x:Name="lbxSuggestion" Grid.Row="1" Background="LightYellow" Visibility="Collapsed"
HorizontalAlignment="Right" VerticalAlignment="Top" Width="325" Margin="0, 0, 10, 0"
SelectionChanged="lbxSuggestion_SelectionChanged"/>
</Grid>
</Window>
아래와 같이 코딩을 해주자.
문자열들의 리스트가될 샘플 데이트를 만든다.
List<string> nameList;
public Window1()
{
InitializeComponent();
{
InitializeComponent();
nameList = new List<string>
{
"yuk1","yuk2","yuk3","yuk4", "yuk5", "yuk6"
};
{
"yuk1","yuk2","yuk3","yuk4", "yuk5", "yuk6"
};
tbxAuto.TextChanged += new TextChangedEventHandler(tbxAuto_TextChanged);
}
}
텍스트 박스 tbxAuto 의 TextChaned 이벤트 핸들러에 아래와 같이 코딩해 주자.
void tbxAuto_TextChanged(object sender, TextChangedEventArgs e)
{
string typeString = tbxAuto.Text;
List<string> autoList = new List<string>();
autoList.Clear();
foreach (string item in nameList)
{
if (!string.IsNullOrEmpty(tbxAuto.Text))
{
if (item.StartsWith(typeString))
autoList.Add(item);
}
}
{
if (!string.IsNullOrEmpty(tbxAuto.Text))
{
if (item.StartsWith(typeString))
autoList.Add(item);
}
}
if (autoList.Count > 0)
{
lbxSuggestion.ItemsSource = autoList;
lbxSuggestion.Visibility = Visibility.Visible;
}
else if (tbxAuto.Text.Equals(""))
{
lbxSuggestion.Visibility = Visibility.Collapsed;
lbxSuggestion.ItemsSource = null;
}
else
{
lbxSuggestion.Visibility = Visibility.Collapsed;
lbxSuggestion.ItemsSource = null;
}
}
{
lbxSuggestion.ItemsSource = autoList;
lbxSuggestion.Visibility = Visibility.Visible;
}
else if (tbxAuto.Text.Equals(""))
{
lbxSuggestion.Visibility = Visibility.Collapsed;
lbxSuggestion.ItemsSource = null;
}
else
{
lbxSuggestion.Visibility = Visibility.Collapsed;
lbxSuggestion.ItemsSource = null;
}
}
저장되어 있는 문자로 텍스트 박스에 입려하게 되면 리스트박스 lbxSuggestion 에 팝업으로 저장된 문자열이 보인다. 팝업된 특정 아이템을 선택 했을 때 텍스트 박스에 적용 시키기 위하여 아래와 같이 코딩해 준다.
private void lbxSuggestion_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (lbxSuggestion.ItemsSource != null)
{
lbxSuggestion.Visibility = Visibility.Collapsed;
tbxAuto.TextChanged -= new TextChangedEventHandler(tbxAuto_TextChanged);
if (lbxSuggestion.SelectedIndex != -1)
{
tbxAuto.Text = lbxSuggestion.SelectedItem.ToString();
}
{
tbxAuto.Text = lbxSuggestion.SelectedItem.ToString();
}
tbxAuto.TextChanged +=new TextChangedEventHandler(tbxAuto_TextChanged);
}
}
}
}
실행 화면은 다음과 같다.

샘플 프로젝트
cfile8.uf.03620C3350AEC2EA1EE8A5.zip
Review
- Visibility 프로퍼티
Visibility 프로퍼티는 UIElement 클래스에 정의되 있다. Visibility 프로퍼티 값이 Collapsed 이므로 엘리먼트는 보이지 않고 화면 배치 러리 과정에 참여 하지도 않는다.
- 이벤트 핸들러 제거, 추가
한번 연결된 이벤트 핸들러를 계속 사용하는 것이 아니라 삭제 할 수 도 있다는것!
이벤트 핸들러를 삭제해 주고 문자열을 텍스트박스에 넣어준 다음 다시 핸들러를 연결시켜 주었다.
- 팝업된 리스트박스의 아이템을 키보드 방향키 입력으로 선택되게 했으면 좋겠는데...
일단 이건 추후에!
댓글 없음:
댓글 쓰기