~ 150 이미지를 고해상도 (~ 5 MB 각 이미지)로 동시에 표시해야합니다. 문제는 모든 이미지를 동시에로드하는 데 많은 시간이 필요하다는 것입니다. 그래서 저는 처음에는 저해상도 이미지를 보여주고 그 동안에는 배경에서 진정한 고해상도 이미지를로드하려고합니다. 그런 다음 준비가되면 스위치를 켭니다.저해상도 이미지를 고해상도 이미지로 바꾸기
1
A
답변
-1
잠시 후 나는이 해결책으로 끝냈다. 우선은 낮은 해상도의 이미지를로드하고 나는 그리드에 추가 :
BackgroundWorker bgw = new BackgroundWorker();
bgw.DoWork += (s, args) =>
{
int i = 0;
foreach (var extElem in _imgList)
{
String url = extElem.HighResImageUri;
Image img = _imgList.ElementAt(i);
BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.UriSource = new Uri(url, UriKind.Absolute);
bi.EndInit();
bi.Freeze();
Dispatcher.BeginInvoke((Action)(() =>
{
img.Source = bi;
}));
}
i++;
}
bgw.RunWorkerAsync();
0
: 다음
foreach (var extElem in ElemList)
{
IdImage img = new IdImage();
img.Id = extElem.ImageID;
img.CollectionId = extElem.CollectionID;
BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.UriSource = new Uri(extElem.Url, UriKind.Absolute);
bi.DecodePixelWidth = 200; //If you want to further reduce the image size (and load time)
bi.EndInit();
img.Source = bi;
grid.Children.Add(img);
_imgList.Add(img);
}
나는 이미지에게 고해상도를로드하고 비트 맵의 원본을 변경하는 백그라운드 작업을 시작합니다 나는 그 C# 코드를 모두 신경 쓰지 않을 것이다. 대신 컬렉션 컨트롤과 파일 경로 모음을 사용합니다. 이 예제를보십시오 :
<ListBox ItemsSource="{Binding FilePaths}">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
<DataTemplate>
<Image Source="{Binding}" Width="250" Stretch="Uniform" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
...
private ObservableCollection<string> filePaths = new ObservableCollection<string>();
public ObservableCollection<string> FilePaths
{
get { return filePaths; }
set { filePaths = value; NotifyPropertyChanged("FilePaths"); }
}
...
FilePaths = new ObservableCollection<string>(Directory.GetFiles(
Environment.GetFolderPath(Environment.SpecialFolder.MyPictures), "*.png"));
-1. 좋은 솔루션은 코드에서 UI 요소를 만들고 조작하는 대신 적절한 DataTemplate 및 뷰 모델을 사용하여 ItemsControl을 사용했을 것입니다. 웹에서 'MVVM'을 검색하십시오. – Clemens
그래, 나는 그렇게했다. 나는 ItemsControl, DataTemplate 등을 사용했다. 그러나 나는 더 복잡한 애플리케이션을 가지고 있고, 내가 여기서 설명한 것과 그 이미지는 150 개가 넘는 "base.Internalchildren"이미지의 오버레이에있다. 2000) 애니메이션을 부드럽게 재생할 수 있도록 낮은 해상도로 렌더링됩니다. – Marco
그러면 여기에 대한 답은 BackgroundWorker에서 작업하는 방법을 보여주는 것입니다. – Clemens