Добрый день! Уже долгое время бьюсь над следующей проблемой..
Есть класс ImageCollection который помещает в свою коллекцию картинки:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
namespace Images.MyColl
{
// To significantly reduce the sample data footprint in your production application, you can set
// the DISABLE_IMAGES conditional compilation constant and disable sample data at runtime.
#if DISABLE_IMAGES
internal class ImageCollection { }
#else
public class ImageCollection : System.ComponentModel.INotifyPropertyChanged
{
public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
{
this.PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
}
}
public ImageCollection()
{
try
{
System.Uri resourceUri = new System.Uri("/Silva;component/Images/ImageCollection/ImageCollection.xaml", System.UriKind.Relative);
if (System.Windows.Application.GetResourceStream(resourceUri) != null)
{
System.Windows.Application.LoadComponent(this, resourceUri);
}
}
catch (System.Exception)
{ }
}
private ItemCollection _Collection = new ItemCollection();
public ItemCollection Collection
{
get
{
return this._Collection;
}
}
}
public class ItemCollection : System.Collections.ObjectModel.ObservableCollection<Item>
{ }
public class Item : System.ComponentModel.INotifyPropertyChanged
{
public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
{
this.PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
}
}
private System.Windows.Media.ImageSource _image = null;
public System.Windows.Media.ImageSource image
{
get
{
return this._image;
}
set
{
if (this._image != value)
{
this._image = value;
this.OnPropertyChanged("image");
}
}
}
}
#endif
}
Когда приложение собирается, он выступает в роли ресурса с ключом ImageCollect, как видно ниже:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
<Application x:Class="Silva.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Images="clr-namespace:Images.MyColl"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Application.Resources>
<ResourceDictionary>
<Images:ImageCollection x:Key="ImageCollect" d:IsDataSource="True"/>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Assets/Styles.xaml"/>
<ResourceDictionary Source="Assets/Templates.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
Всё это барахло :) у меня отлично работает в ListBox на MainPage.xaml (картинки меняются по нажатию клавиш вверх-вниз), щас покажу как там всё забиндено:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
<UserControl
x:Class="Silva.MainPage"
xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
xmlns:uriMapper="clr-namespace:System.Windows.Navigation;assembly=System.Windows.Controls.Navigation"
xmlns:my="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data.Input"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="1024" d:DesignHeight="768">
<Grid x:Name="LayoutRoot" Style="{StaticResource LayoutRootGridStyle}">
<!-- Header -->
...........
<!-- Body -->
<Grid x:Name="ContentGrid" Style="{StaticResource LayoutRootGridStyle}" DataContext="{Binding Source={StaticResource ImageCollect}}" Margin="0,80">
<sdk:DataPager x:Name="ImageCollectionDataPager" Template="{StaticResource DataPagerTemplate}"
Style="{StaticResource DataPagerStyle}" d:LayoutOverrides="Width" Margin="0,200,0,0"/>
<ListBox x:Name="ImageCollectionListBox" Height="200" VerticalAlignment="Top" BorderThickness="0" Background="{StaticResource TransparentWhiteBrushKey}"
ScrollViewer.HorizontalScrollBarVisibility="Disabled" ScrollViewer.VerticalScrollBarVisibility="Disabled" Padding="0"
ItemsSource="{Binding Collection}" ItemContainerStyle="{StaticResource ListBoxItemStyle}"/>
</Grid>
<!-- Footer-->
...........
</Grid>
</UserControl>
Как видно там есть ImageCollectionDataPager, который я хочу прикрутить "за место" кнопочек клавиатуры.
Если обратиться к msdn
http://msdn.microsoft.com/ru-ru/library/system.windows.controls.datapager(v=VS.95).aspx
то там сказано, назначить ItemsSource свойство элемента управления(в данном случае это ListBox) и свойство DataPager..::..Source одной и той же коллекции данных. Также необходимо чтобы эта коллекция обеспечивала функциональные возможности разбиения по страницам. Я хотел в коде MainPage.xaml.cs получить коллекцию из ресурсов и обернуть её в класс PagedCollectionView, примерно так:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
using System;
using System.Windows;
using System.Windows.Browser;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Navigation;
namespace Silva
{
using Silva.Views;
using Images.MyColl;
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
ImageCollection tx = App.Current.Resources[ImageCollect];
PagedCollectionView ty = new PagedCollectionView(tx.Collection);
ImageCollectionDataPager.Source = ty;
}
}
}
Но не могу получить ресурс, может кто-то предложит другую организацию получения этого дела, для достижения результата.
Может кто-то предложит немного изменить класс ImageCollection, чтобы уже в нем отнаследоваться от интерфейса IPagedCollectionView или же просто поместить полем PagedCollectionView. Как будет лучше?