Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Занятый файл (контрол System.Windows.Conrols.Image в VS2008 WPF – проект Framework 3.5) / 5 сообщений из 5, страница 1 из 1
16.11.2009, 14:23
    #36312596
Editor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Занятый файл (контрол System.Windows.Conrols.Image в VS2008 WPF – проект Framework 3.5)
Помогите разобраться с проблемой: программа не «отпускает» файл. Есть приложение «Записная книжка» – множество записей о людях состоящих из: имени, фото и краткой заметки. Каждая такая запись – объект Man:
Код: plaintext
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.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
public class Man : INotifyPropertyChanged
    {
        private string name;
        private string photo;
        private string remark;
        private OpenFileDialog openPhotoFile;
        
        public string Name {
            get { return name; }
            set 
            {
                if (name != value) 
                { 
                    name = value; 
                    NotifyPropertyChanged("Name"); 
                }
            }
        }

        public string Photo
        {
            get{ return photo;}
        }

        public string Remark {
            get { return remark; }
            set 
            {
                if (remark != value)
                { 
                    remark = value;
                    NotifyPropertyChanged("Remark");
                }
            }
        }

        public bool LoadPhoto()
        {

            openPhotoFile = new OpenFileDialog{Filter = "All supported files|*.jpg;*.bmp;*.png|All files|*.*"};
            string new_file_path;
            string application_folder;

            if (openPhotoFile.ShowDialog() == true) 
            {
                application_folder = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
                new_file_path = application_folder + "\\" + Path.GetFileName(openPhotoFile.FileName);
                
                System.IO.File.Copy(openPhotoFile.FileName,new_file_path,true);

                photo = new_file_path;
                NotifyPropertyChanged("Photo");
                return true;
            }
            else 
            {
                return false;
            }
        }

        public bool ClearPhoto()
        {
            string photo_path = photo;
            photo = null;
            NotifyPropertyChanged("Photo");
            if(System.IO.File.Exists(photo_path))
            {
                
            }   
            return true;
        }

        public Man()
        {
        }

        public event PropertyChangedEventHandler PropertyChanged;

        public void NotifyPropertyChanged(string which)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(which));
            }
        }
    }

На форме имеется элемент типа System.Windows.Controls.Image:
Код: plaintext
1.
<Image x:Name="PhotoImage" Source="{Binding Path=Photo, Mode=OneWay}" />

И соответствующее свойство:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public Image PhotoImage
        { 
            get 
            {
                //ContentPresenter myContentPresenter = new ContentPresenter();
                ListBoxItem lbItem = (ListBoxItem)(lstPeoples.ItemContainerGenerator.ContainerFromItem(lstPeoples.Items.CurrentItem));
                ContentPresenter myContentPresenter = FindVisualChild<ContentPresenter>(lbItem);               
               
                return (Image)lstPeoples.ItemTemplate.FindName("PhotoImage", myContentPresenter);
            } 
        }

Проблема заключается в том что после вызова ClearValue(), сама картинка естественно пропадает но файл откуда береться катинка не отпускается.

Перепробовал много чего и управление GarbageCollector и попытку подцепить интерфейс IDisposable, и очиству свойств (функция ClearValue) как Image так и ImageSource.

Можно проследить интересные закономерности:
1)
а) создаём 3 объекта Man (A,B,C)
б) загружаем(Man.LoadPhoto) fileA в A и fileB в B
в) очищаем объект(Man.ClearPhoto) A, смотрим: программа держит fileA
г) очищаем объект B, смотрим: программа держит и fileA, и fileB
д) загружаем fileC в C, программа отпускает и fileA, и fileB
2)
а) создаём объекта Man (A)
б) загружаем fileA в A
в) очищаем объект A, смотрим: программа держит fileA
г) загружаем fileB в A
д) очищаем объект A, смотрим: программа отпускает fileA

3)
а) создаём объект Man (A)
б) загружаем fileA в A
в) загружаем fileB в A без очиски, смотрим: программа держит fileA
г) загружаем fileC в A без очиски, смотрим: программа отпускает fileA, но держит fileB
д) загружаем fileC в A без очиски, смотрим: программа отпускает fileB, но держит fileD
и т.д.

4)
а) создаём 2 объекта Man (A,B)
б) загружаем fileA в A
в) очищаем объект A, смотрим: программа держит fileA
д) загружаем fileB в B, программа отпускает и fileA
...
Рейтинг: 0 / 0
16.11.2009, 20:45
    #36313532
Гата Селов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Занятый файл (контрол System.Windows.Conrols.Image в VS2008 WPF – проект Framework 3.5)
Весь текст не осилил, но была у меня трабла, что поле чтения в имейдж файл не отпускался. Решил чтением файла в поток, а из потока в имейдж
...
Рейтинг: 0 / 0
17.11.2009, 03:39
    #36313811
Roman S. Golubin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Занятый файл (контрол System.Windows.Conrols.Image в VS2008 WPF – проект Framework 3.5)
Editor,

что-то у вас тут каша какая-то. Если не вермишель.

1. везде используете NotifyPropertyChanged,
а в случае с Photo - выкинули приватный сеттер и вызываете снаружи.

Если уж
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 public string Name {
            get { return name; }
            set 
            {
                if (name != value) 
                { 
                    name = value; 
                    NotifyPropertyChanged("Name"); 
                }
            }
        }
то и
Код: plaintext
1.
2.
3.
4.
        public string Photo
        {
            get{ return photo;}
            private set { photo = value; NotifyPropertyChanged("Photo"); }
        }

Это к проблеме, конечно, прямого отношения не имеет, но если у вас все так написано, то запутаться будет очень просто.

2. То что вы очистили ссылку на картинку из UI еще не означает, что на нее нет других ссылок из других мест. На эту мысль наводит странное свойств
Код: plaintext
о public Image PhotoImage.

3. Ссылок на объекты UI лучше вообще не иметь. Тем более, в таком странном сочетании с ItemContainerGenerator
4. Для работы с изображениями лучше создать конвертер. Пример в аттаче.
...
Рейтинг: 0 / 0
17.11.2009, 03:53
    #36313814
Roman S. Golubin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Занятый файл (контрол System.Windows.Conrols.Image в VS2008 WPF – проект Framework 3.5)
Да, еще. Для быстрой загрузки превьюшек можете посмотреть ThumbnailBuilder - грузит картинки достаточно быстро, в отдельном потоке, блокирует файл только на момент чтения.

...
Рейтинг: 0 / 0
18.11.2009, 10:14
    #36316526
Editor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Занятый файл (контрол System.Windows.Conrols.Image в VS2008 WPF – проект Framework 3.5)
Roman S. Golubin,

Спасибо большое, очень помогли! Про конвертер сам бы не догадался! И за общую критику кода и в целом системы тоже спасибо. Будем разбираться.
...
Рейтинг: 0 / 0
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Занятый файл (контрол System.Windows.Conrols.Image в VS2008 WPF – проект Framework 3.5) / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]