рд╣рдо LongListSelector рдореЗрдВ рдбреЗрдЯрд╛ рд╡рд░реНрдЪреБрдЕрд▓рд╛рдЗрдЬреЗрд╢рди рдХрд░рддреЗ рд╣реИрдВ

рдирдорд╕реНрддреЗред

WP8 рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░ рд▓рдВрдмреА рд╕реВрдЪреА рд╡рд░реНрдЪреБрдЕрд▓рд╛рдЗрдЬреЗрд╢рди рдХреИрд╕реЗ рдХрд░реЗрдВ, рдЗрд╕ рд╡рд┐рд╡рд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░реА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рд╕реЗ рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЛ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣рд╛рдВ рд╡рд┐рдВрдбреЛрдЬ 8 dektopnoy рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдП рдЧрдП рддрд░реАрдХреЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╣реА ISupportIncrementalLading рдмрд╕ WP8 рдкрд░ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИред

рдФрд░ рдЬрдм рд╕реЗ рдореИрдВ (рдПрдХ рдкреНрд░рдмрдВрдзрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдкрдиреЗ рдЦрд╛рд▓реА рд╕рдордп рдореЗрдВ) рдПрдХ рдЖрд╡реЗрджрди рдХрд░рддрд╛ рд╣реВрдВ рдЬрд╣рд╛рдВ рдЗрд╕ рддрд░рд╣ рдХрд╛ рд╡рд░реНрдЪреБрдЕрд▓рд╛рдЗрдЬреЗрд╢рди рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдореИрдВрдиреЗ рдЕрдкрдирд╛ рд╕рдорд╛рдзрд╛рди рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдореБрдЭреЗ рддреБрд░рдВрдд рдХрд╣рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдореИрдВ рдЖрджрд░реНрд╢ рд╣реЛрдиреЗ рдХрд╛ рджрд┐рдЦрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░рддрд╛, рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдШрдВрдЯреЛрдВ рдЧреБрдЧрд▓реА рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рд╕реЗ рдмрдЪрд╛ рд╕рдХрддрд╛ рд╣реИред

рдкреАрдПрд╕ рдирд╛рдЙ рдореИрдВрдиреЗ рдореЛрдиреЛрдЯреВрдЪ рдХреЗ рддрд╣рдд рдЖрдИрдУрдПрд╕ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛ рдФрд░ рдРрд╕реА рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдбреНрд░рд╛рдлреНрдЯ рд╕реЗ рд▓реЗрдЦ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдЖрдк рдХрднреА рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдХреМрди рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред

рдкреНрд░рд╕реНрддреБрддрд┐ рдПрдХ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реЛрдЧреА рддрд╛рдХрд┐ рдЬреЛ рд▓реЛрдЧ рдЕрднреА рднреА рдордВрдЪ рдФрд░ .net рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ рд╡реЗ рдЗрд╕реЗ рдЦреЗрд▓ рд╕рдХреЗрдВред

рдореИрдВ рдХрд┐рд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдБ




рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдХреНрдпрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ


XAML LongListSelector рдореЗрдВ рдмрдирд╛рдПрдБ

рдпрд╣ рд▓реЙрдиреНрдЧрд▓рд┐рд╕реНрдЯ рдЪрдпрдирдХрд░реНрддрд╛ рд╣реИ рдЬреЛ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рддреМрд░ рдкрд░ рдПрдордПрд╕ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд╢рдВрд╕рд┐рдд рдирд┐рдпрдВрддреНрд░рдг рд╣реИред рдЕрдм рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рд╕реНрдЯрдмреЙрдХреНрд╕ рдХреА рдЕрддреНрдпрдзрд┐рдХ рдЕрдиреБрд╢рдВрд╕рд╛ рдХреА рдЬрд╛рддреА рд╣реИред рдЦреИрд░, рд╣рдо рдирд╣реАрдВ рдЬреАрдд рдкрд╛рдПред

<phone:LongListSelector Width="480" DataContext="{Binding}" Name="List_ListSelector" ItemTemplate="{StaticResource List_ListSelectorItemDataTemplate}" /> 


рд╣рдорд╛рд░реЗ LongListSelector рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд╕рд╛рде App.xaml рдореЗрдВ рдПрдХ DataTemplate рдмрдирд╛рдПрдБред


рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдХреЗрд╡рд▓ рдкрд╛рда рд╣реИ рдЬреЛ рдЖрдЗрдЯрдо рдирдВрдмрд░ рдФрд░ рдЪрд┐рддреНрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред

 <Application.Resources> <DataTemplate x:Key="List_ListSelectorItemDataTemplate"> <StackPanel Margin="0,0,0,27" Height="400"> <TextBlock Text="{Binding Path=ID}" /> <Image Source="{Binding Path=ImageToShow}", Name="ListImage"></Image> </StackPanel> </DataTemplate> </Application.Resources> 


рд╣рдо рдПрдХ рд╕рд╣рд╛рдпрдХ рд╡рд░реНрдЧ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рд╣рдорд╛рд░реА рд╢реАрдЯ, рд╕рдВрдЧреНрд░рд╣ рдФрд░ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд░рдг рд╣реЛрдЧрд╛ред рдЪрд▓реЛ рдЗрд╕реЗ рд▓реЙрдиреНрдЧрд╡реАрд░реНрдЯреБрдЕрд▓рд┐рд╕реНрдЯ рдХрд╣рддреЗ рд╣реИрдВред


  class LongVirtualList { public LongListSelector List; //    public ObservableCollection<BaseListElement> Collection; // ,      public DataSource DataSource;//     .   -       - .     ,   . public LongVirtualList(LongListSelector longListSelector) { this.List = longListSelector; this.Collection = new ObservableCollection<BaseListElement>(); this.DataSource = new DataSource(); this.InitializeCollection(this.DataSource); //        , maxCount   .     . this.List.ItemsSource = this.Collection; longListSelector.ItemRealized+=this.longListSelector_ItemRealized; longListSelector.ItemUnrealized+=this.longListSelector_ItemUnrealized; } private void InitializeCollection(DataSource dataSource) { for (int i = 0; i < dataSource.Count; i++) { this.Collection.Add(new ListTestElement(i)); //ListTestElement  -  BaseListElement. } } 


рдпрд╣ рдХреНрд▓рд╛рд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдХрдкреАрд╕ рд╣реИред рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд╣рдо рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдкреВрд░реНрдг рд╕рдВрдЧреНрд░рд╣ рд╕рдВрд▓рдЧреНрди рдХрд░реЗрдВред рдпрд╣ рд╕рд╣рдЬ рд╕реНрдХреНрд░реЙрд▓рд┐рдВрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рддрддреНрд╡реЛрдВ рдХреА рдХреЛрдИ рдорд░реЛрдбрд╝ рдирд╣реАрдВ (рдЧрддрд┐рд╢реАрд▓ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рдХреБрдЫ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рднреА рдПрдХ рдЫреЛрдЯреЗ рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рддрддреНрд╡реЛрдВ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╣рдорд╛рд░рд╛ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИ)ред рдЦрд╛рд▓реА рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдмрд╣реБрдд рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдХреЗ рд╕рд╛рде рднреА рд╕реНрдореГрддрд┐ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рдмрдирддрд╛ рд╣реИ (рдореИрдВрдиреЗ рдПрдХ рд▓рд╛рдЦ рдХреА рдЬрд╛рдБрдЪ рдХреА рдФрд░ рд╕рдм рдХреБрдЫ рдареАрдХ рдерд╛)ред

рдЕрдм рдордЬреЗрджрд╛рд░ рд╣рд┐рд╕реНрд╕рд╛ рдЖрддрд╛ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдореИрдВ рдпрд╣ рд╕рдм рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдВред


MS рдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЖрдпреЛрдЬрди рд╢реБрд░реВ рдХрд┐рдП:

ItemRealized рдФрд░ ItemUnrealized

рдЙрдирдореЗрдВ рд╕реЗ рдкрд╣рд▓рд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рд╕реВрдЪреА рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ рдирдИ рд╡рд╕реНрддреБ рдХреЛ рд▓реЛрдб рдХрд░рдирд╛ рдЪрд╛рд╣рддреА рд╣реИред рдЬрдм рдЗрд╕ рдЖрдЗрдЯрдо рдХреЛ рдЙрддрд╛рд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рджреВрд╕рд░рд╛ рдЪрд╛рд▓реВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЬреЛрдбрд╝: рдЖрдк рдЗрди рдШрдЯрдирд╛рдУрдВ рдХреЗ рдХреЙрд▓ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдЬрдм рдлрд╝реЛрди "рдорд╣рд╕реВрд╕" рдХрд░рддрд╛ рд╣реИ рддреЛ рдЙрд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд╣ рдЗрд╕реЗ рдХреИрд╕реЗ рд╕рдордЭрддрд╛ рд╣реИ? рдХрд┐рддрдиреЗ рд╕реВрдЪреА рдЖрдЗрдЯрдо рд╕реНрдХреНрд░реАрди рдкрд░ рдлрд┐рдЯ рд╣реЛрддреЗ рд╣реИрдВ + рдереЛрдбрд╝рд╛ рдкрд┐рдЫрд▓реЗ рдФрд░ рдЕрдЧрд▓реЗред рдФрд░ рдпрд╣рд╛рдВ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдиреБрдХрд╕рд╛рди рдЫрд┐рдкрд╛ рд╣реИ, рдЬреЛ рдореБрдЭреЗ рдЕрдиреБрднрд╡ рд╕реЗ рдкрддрд╛ рдЪрд▓рд╛, рдЙрд╕ рдкрд░ рдХрдИ рдШрдВрдЯреЗ рдорд╛рд░реЗ рдЧрдПред рдпрд╣ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕реНрдХреНрд░реАрди рдкрд░ рд╕реВрдЪреА рдЖрдЗрдЯрдо рдХреА рд╕рдВрдЦреНрдпрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдПрдХ рдЧрддрд┐рд╢реАрд▓ рдЖрдХрд╛рд░ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЪрд┐рддреНрд░) рд╡рд╛рд▓реЗ рддрддреНрд╡реЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдЖрдк рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЙрдирдХрд╛ рдЖрдХрд╛рд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк XAML рдореЗрдВ StackPanel Height = "400" рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ ItemRealized рдЗрд╡реЗрдВрдЯ ~ 6 рд╕реВрдЪреА рдЖрдЗрдЯрдо рдХреЗ рд▓рд┐рдП рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдЙрдард╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрджрд┐ рдЖрдк рдПрдХ рд╣реА рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдПрдХ рдКрдВрдЪрд╛рдИ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдмрд╛рд╣рд░реА рдкрд░рд┐рдгрд╛рдо рд╕рдорд╛рди рд╣реЛрдЧрд╛ (рдпрджрд┐ рдЖрдк рдПрдХ рдмрдбрд╝реА рддрд╕реНрд╡реАрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ), рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрдВрдЬрди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 50 рдЯреБрдХрдбрд╝реЗ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдЧрд╛ рдФрд░ рдпрд╣ рдПрдХ рдореЗрдореЛрд░реА рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рддреНрд░реБрдЯрд┐ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред

рддреЛ:
 public void longListSelector_ItemUnrealized(object sender, ItemRealizationEventArgs e) { BaseListElement item = (BaseListElement)e.Container.Content; if (item != null) { item.NullCache(); } } public void longListSelector_ItemRealized(object sender, Microsoft.Phone.Controls.ItemRealizationEventArgs e) { BaseListElement item = (BaseListElement)e.Container.Content; if (item != null) { if (item.Cached == false) { item.FillCache(); } } } 


рд╕реНрд╡рдпрдВ рд╕реВрдЪреА рдЖрдЗрдЯрдореЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ


рд╕реВрдЪреА рдХрд╛ рдЖрдзрд╛рд░ рддрддреНрд╡ BaseListElement рд╡рд░реНрдЧ рд╣реИред рдЖрдк рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдХреЗ рдХрд┐рд╕реА рднреА рд╡рдВрд╢ рдХреЛ рдЙрд╕реА рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

 class BaseListElement : PropertyHelper // ,   PropertyChangedEventHandler   .        BaseListElement,         EventHandler.  -  BaseListElement  PropertyHelper   . { public int ID; public bool Cached; private BitmapImage imageToShow; public BitmapImage ImageToShow { get { return this.imageToShow; } set { this.imageToShow = value; NotifyChange("ImageToShow"); } } public BaseListElement(int id) { this.ID = id; this.Cached = false; } public virtual void NullCache() { this.Cached = false; if (this.ImageToShow != null) { this.ImageToShow = null; GC.Collect(); } } public virtual void FillCache() { this.Cached = true; // this.ImageToShow = DataSource.LoadImage(this.ID);     ,        // ,  BitmapImage bi = new BitmapImage(new Uri("Assets/test.jpg", UriKind.Relative)); bi.DecodePixelWidth = 400; bi.CreateOptions = BitmapCreateOptions.IgnoreImageCache; this.ImageToShow = bi; } //        ,      . public virtual async Task FillCacheAsync() { this.FillCache(); } } 


рд╕рдм рдХреБрдЫ рд╕реЛрдЪреЛ? рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдХреИрд╕реЗред рд╕рдорд╛рди рд╢реНрд░реЗрдгреА рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд╛рд▓рд╛ рдХреЛрдб рдХреБрдЫ рдЕрдкрд▓реЛрдб рдХреА рдЧрдИ рдЫрд╡рд┐рдпреЛрдВ рдореЗрдВ рдорд░ рдЬрд╛рдПрдЧрд╛ред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ WP8 рдмрд╣реБрдд "рд╣рд╛рдИ-рд╣реИрдВрдбреЗрдб" рд╣реИ (рд╕рд╣реА рд╢рдмреНрдж рдирд╣реАрдВ рд╣реИ!) рдбреЗрдЯрд╛ рдХреЗ рдмрд┐рдЯрдореИрдк рдЗрдореЗрдЬ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдкрдиреЗ рдЖрдк рд╣реА рдХрд┐рд╕реА рдкрд░ рддрд╕реНрд╡реАрд░реЗрдВ рдЕрдкрд▓реЛрдб рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ!

рдЗрд╕рд▓рд┐рдП, рд╣рдо NullCache () рдФрд░ FillCache () рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЕрдм рдЙрдиреНрд╣реЗрдВ рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдЫрд╡рд┐ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд▓рд┐рдВрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдЙрдиреНрд╣реЗрдВ рд╡рд┐рдзрд┐рдпреЛрдВ рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рд▓рд┐рдВрдХ рдХреЛ рд╣рдо ItemUnrealized рдФрд░ ItemRelized рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ e.Container рдХрдВрдЯреЗрдирд░ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред

рддреЛ, рд╕рд╣реА рдЫрд╡рд┐ рдХреИрд╢рд┐рдВрдЧ:

 public virtual void NullCache(Image image) { if (this.ImageToShow != null) { //   ,   . BitmapImage bitmapImage = image.Source as BitmapImage; bitmapImage.UriSource = null;//   image.Source = null;// ,        . DisposeImage(this.ImageToShow)//     ,      .   =null   ,            . GC.Collect(); } this.Cached = false; } public virtual void FillCache(Image image) { this.Cached = true; BitmapImage bi = new BitmapImage(new Uri("Assets/test.jpg", UriKind.Relative)); bi.DecodePixelWidth = 400; bi.CreateOptions = BitmapCreateOptions.IgnoreImageCache; this.ImageToShow = bi; //    image    source,         .    XAML   . Binding ImageValueBinding = new Binding("ImageToShow"); ImageValueBinding.Source = this; args.ImageControl.SetBinding(Image.SourceProperty, ImageValueBinding); } public static void DisposeImage(BitmapImage image) { Uri uri= new Uri("oneXone.png", UriKind.Relative);//   1x1,     StreamResourceInfo sr=Application.GetResourceStream(uri); try { using (Stream stream=sr.Stream) { image.DecodePixelWidth=1; //  .    ,      .    "",       BitmapImage    .   ,         WP8,   . (..    ,       ). image.SetSource(stream); } } catch {} } 


рд╣рдореЗрдВ рд▓реЛрдбрд┐рдВрдЧ / рдЕрдирд▓реЛрдбрд┐рдВрдЧ рддрддреНрд╡реЛрдВ рдХреЗ рд╣рдорд╛рд░реЗ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЫрд╡рд┐ рдХрд╣рд╛рдВ рдорд┐рд▓реЗрдЧреА?
рдпрд╣рд╛рдБ рд╕реЗ:

  public void longListSelector_ItemRealized(object sender, Microsoft.Phone.Controls.ItemRealizationEventArgs e) { BaseListElement item = (BaseListElement)e.Container.Content; Image img= FindChild<Image>(e.Container, "ListImage"); if (item != null) { if (item.Cached == false) { item.FillCache(); } } } public static T FindChild<T>(DependencyObject parent, string childName) where T : DependencyObject { if (parent == null) { return null; } T foundChild = null; int childrenCount = VisualTreeHelper.GetChildrenCount(parent); for (int i = 0; i < childrenCount; i++) { DependencyObject child = VisualTreeHelper.GetChild(parent, i); var childType = child as T; if (childType == null) { //      foundChild = FindChild<T>(child, childName); if (foundChild != null) { break; } } else if (!string.IsNullOrEmpty(childName)) { var frameworkElement = child as FrameworkElement; //     if (frameworkElement != null && frameworkElement.Name == childName) { foundChild = (T)child; break; } //    ,            foundChild = FindChild<T>(child, childName); } else { foundChild = (T)child; break; } } return foundChild; } 


рдХреЗрд╡рд▓ рдереЛрдбрд╝рд╛ рд╣реА рд╢реЗрд╖ рд╣реИ, рдореИрдВ рдкреНрд░реЙрдкрд░реНрдЯреА рд╣реЗрд▓реНрдкрд░ рд╕рд╣рд╛рдпрдХ рд╡рд░реНрдЧ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рджрд┐рдЦрд╛рдКрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╡рд┐рд╕реНрддреГрдд рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рд╣реИ:

  public abstract class PropertyHelper:INotifyPropertyChanged { protected void NotifyChange(string args) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(args)); } } public event PropertyChangedEventHandler PropertyChanged; } 


рд╕реВрдЪреА рдЖрдЗрдЯрдореНрд╕ рдХреЗ рдЧреБрдгреЛрдВ рдореЗрдВ PropertyChanged рдШрдЯрдирд╛рдУрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рд╣рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреЗ рдЕрджреНрдпрддрди рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддреА рд╣реИ, рднрд▓реЗ рд╣реА рд╡реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдЗрд╢рд╛рд░реЛрдВ рдХреЗ рдмрд┐рдирд╛ рд╕реВрдЪреА рдореЗрдВ рд▓реЛрдб рдХрд┐рдП рдЧрдП рд╣реЛрдВред рдпрд╣ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рднрд╛рд╖рд╛ рдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕реВрдЪреА рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╕рдордп, рдЗрд╕рдХреЗ рддрддреНрд╡реЛрдВ рдХреЛ рдкреГрд╖реНрда рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓реЛрдб рдХрд┐рдП рдмрд┐рдирд╛, рд╕реНрд╡рдпрдВ рджреНрд╡рд╛рд░рд╛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЖрдЦрд┐рд░реА рдХреНрд╖рдг рдФрд░ рдЖрдк рдХрд░ рд░рд╣реЗ рд╣реИрдВред

  public MainPage() { InitializeComponent(); LongVirtualList virtualList = new LongVirtualList(List_ListSelector); } 


рдЗрд╕ рдЖрдзрд╛рд░ рдкрд░, рдЖрдк рдШрдВрдЯреА рдФрд░ рд╕реАрдЯреА рдмрдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреИрд╢ рдпрд╛ рдХреБрдЫ рдФрд░ рдЬреЛ рдЖрдк рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдпрд╣ рд╕реВрдЪреА рдореЗрд░реЗ рд▓рд┐рдП 1600 * 1200 рдХреЗ рд╣рдЬрд╛рд░реЛрдВ рдЪрд┐рддреНрд░реЛрдВ рдХреЗ рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреА рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЙрдирдХреА рдЪрд┐рдХрдиреА рд╕реНрдХреНрд░реЙрд▓рд┐рдВрдЧ рдФрд░ рд╕рдордп рдкрд░ рд▓реЛрдбрд┐рдВрдЧ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реЛрддреА рд╣реИред

рдореИрдВрдиреЗ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдбреЗрдЯрд╛ рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рдореБрджреНрджреЗ рдХреЛ рдирд╣реАрдВ рдЫреБрдЖред

рдореБрдЭреЗ рдЦреБрд╢реА рд╣реИ рдХрд┐ рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рдпрд╣ рд╕рдм рдЙрдкрдпреЛрдЧреА рд▓рдЧреЗрдЧрд╛ред рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдореБрдЭреЗ рдХреЛрдИ рдЕрдВрдЧреНрд░реЗрдЬреА рдЗрдВрдЯрд░рдиреЗрдЯ рдмреНрд░реЗрдХ рдирд╣реАрдВ рдорд┐рд▓рд╛, рдореБрдЭреЗ рдЗрд╕ рддрд░рд╣ рдХреА рдХреЛрдИ рднреА рд░реЗрд╕рд┐рдкреА рдирд╣реАрдВ рдорд┐рд▓реА, рдореБрдЭреЗ рдЦреБрдж рд╣реА рд╕рдмрдХреБрдЫ рдИрдЬрд╛рдж рдХрд░рдирд╛ рдкрдбрд╝рд╛ред

Source: https://habr.com/ru/post/In164543/


All Articles