티스토리 뷰
반응형
WPF에서 ComboBox를 사용할 때 ItemsSource에 너무 많은 리스트를 바인딩하면 ComboBox가 느려지는 문제가 있습니다. 대략 1천개의 항목만 바인딩해도 2-3초간 버벅이게 됩니다.
이 문제는 ComboBox가 ItemsSource에 지정된 모든 리스트를 한번에 렌더링하려고 하기 때문에 발생하는 문제입니다. 화면에 보여지는 일부 항목만 렌더링하면 속도가 개선될텐데, WPF는 그렇게 하지 않는 것이죠.
다행이도 WPF는 이러한 문제를 해결하기 위해 VirtualizingStackPanel이라는 클래스를 제공합니다. ListView, DataGrid는 ItemsSource에 수만개의 리스트를 바인딩해도 아무런 문제가 없는데요. 바로 VirtualizingStackPanel를 내부적으로 사용하고 있기 때문입니다. VirtualizingStackPanel는 화면에 보여지는일부 항목만 렌더링하기 때문에 속도가 개선되는 것이지요.
ComboBox는 VirtualizingStackPanel를 사용하지 않기 때문에, 직접 VirtualizingStackPanel를 사용하도록 구현해주어야 합니다. 아래의 순서로 진행해주세요.
- VisualStudio에서 Class를 추가하고, 이름은 적당히 ComboBoxVirtualizing.cs로 해요.
- 아래와 같이 VirtualizingStackPane을 ItemPanel로 지정해주세요.
using System; using System.Windows; using System.Windows.Controls; namespace TestProject.Controls { public class ComboBoxVirtualizing : ComboBox { public ComboBoxVirtualizing() : base() { var itemsPanelTemplate = new ItemsPanelTemplate(); itemsPanelTemplate.VisualTree = new FrameworkElementFactory(typeof(VirtualizingStackPanel)); ItemsPanel = itemsPanelTemplate; } } } - 이제 위에서 생성한 ComboBoxVirtualizing을 테스트해 봅시다. xaml에 다음과 같이 추가합니다.
<control:ComboBoxVirtualizing x:Name="comboboxVirtualizing"> <control:ComboBoxVirtualizing.ItemTemplate> <DataTemplate> <TextBlock Text="{Binding Value}" /> </DataTemplate> </control:ComboBoxVirtualizing.ItemTemplate> </control:ComboBoxVirtualizing> - ItemsSource에 데이터를 할당합니다.
comboboxVirtualizing.ItemsSource = Enumerable.Range(0, 1000) .Select(i => new KeyValuePair<int, string>(i, i.ToString())) .ToArray(); - 이제 프로그램을 실행하여 속도가 개선됐는지 테스트해보세요.
'Windows App' 카테고리의 다른 글
| [WPF] Icon 설정 (0) | 2026.02.13 |
|---|---|
| [WPF] Internet Explorer 실행 (0) | 2024.07.22 |
| [WinUI3] Unpackaged App + Administrator 권한으로 실행 (1) | 2024.07.19 |
| [C#] INotifyPropertyChanged 손쉽게 작성하기 (0) | 2023.05.19 |
| [WPF] WebBrower Rendering Version 변경 (0) | 2017.11.14 |
댓글
최근에 올라온 글
최근에 달린 댓글
TAG
- React
- .NET Standard
- material-ui
- Xamarin
- Vue
- Xamarin.Forms
- Xamarin.Forms eBook
- Xamarin.Forms 요약
- flutter
- linux
- windows
- Android
- npm
- WPF
- Xamarin.iOS
- ios
- VisualStudio
- TypeScript
- ASP.NET Core
- MS SQL
- Total
- Today
- Yesterday