powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Занятый файл (контрол System.Windows.Conrols.Image в VS2008 WPF – проект Framework 3.5)
5 сообщений из 5, страница 1 из 1
Занятый файл (контрол System.Windows.Conrols.Image в VS2008 WPF – проект Framework 3.5)
    #36312596
Editor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите разобраться с проблемой: программа не «отпускает» файл. Есть приложение «Записная книжка» – множество записей о людях состоящих из: имени, фото и краткой заметки. Каждая такая запись – объект 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
Занятый файл (контрол System.Windows.Conrols.Image в VS2008 WPF – проект Framework 3.5)
    #36313532
Гата Селов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Весь текст не осилил, но была у меня трабла, что поле чтения в имейдж файл не отпускался. Решил чтением файла в поток, а из потока в имейдж
...
Рейтинг: 0 / 0
Занятый файл (контрол System.Windows.Conrols.Image в VS2008 WPF – проект Framework 3.5)
    #36313811
Фотография Roman S. Golubin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Занятый файл (контрол System.Windows.Conrols.Image в VS2008 WPF – проект Framework 3.5)
    #36313814
Фотография Roman S. Golubin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, еще. Для быстрой загрузки превьюшек можете посмотреть ThumbnailBuilder - грузит картинки достаточно быстро, в отдельном потоке, блокирует файл только на момент чтения.

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

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


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