Sfoglia il codice sorgente

Доделал метод добавления изображений к пользователю. по умолчанию загружается последнее добавленное изображение

fly9024 1 anno fa
parent
commit
8f7fef4f08

+ 8 - 8
MyWpfApp/Model1.edmx

@@ -25,9 +25,9 @@
           <Key>
             <PropertyRef Name="ID" />
           </Key>
-          <Property Name="ID" Type="int" Nullable="false" />
-          <Property Name="IDUser" Type="int" />
-          <Property Name="Image" Type="varbinary(max)" />
+          <Property Name="ID" Type="int" StoreGeneratedPattern="Identity" Nullable="false" />
+          <Property Name="IDUser" Type="int" Nullable="false" />
+          <Property Name="Image" Type="varbinary(max)" Nullable="false" />
         </EntityType>
         <EntityType Name="UserTable">
           <Key>
@@ -50,7 +50,7 @@
           </ReferentialConstraint>
         </Association>
         <Association Name="FK_UserImages_UserTable">
-          <End Role="UserTable" Type="Self.UserTable" Multiplicity="0..1" />
+          <End Role="UserTable" Type="Self.UserTable" Multiplicity="1" />
           <End Role="UserImages" Type="Self.UserImages" Multiplicity="*" />
           <ReferentialConstraint>
             <Principal Role="UserTable">
@@ -136,9 +136,9 @@
           <Key>
             <PropertyRef Name="ID" />
           </Key>
-          <Property Name="ID" Type="Int32" Nullable="false" />
-          <Property Name="IDUser" Type="Int32" />
-          <Property Name="Image" Type="Binary" MaxLength="Max" FixedLength="false" />
+          <Property Name="ID" Type="Int32" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
+          <Property Name="IDUser" Type="Int32" Nullable="false" />
+          <Property Name="Image" Type="Binary" Nullable="false" MaxLength="Max" FixedLength="false" />
           <NavigationProperty Name="UserTable" Relationship="Smerdova_PPModel.FK_UserImages_UserTable" FromRole="UserImages" ToRole="UserTable" />
         </EntityType>
         <EntityType Name="UserTable">
@@ -176,7 +176,7 @@
           </ReferentialConstraint>
         </Association>
         <Association Name="FK_UserImages_UserTable">
-          <End Type="Smerdova_PPModel.UserTable" Role="UserTable" Multiplicity="0..1" />
+          <End Type="Smerdova_PPModel.UserTable" Role="UserTable" Multiplicity="1" />
           <End Type="Smerdova_PPModel.UserImages" Role="UserImages" Multiplicity="*" />
           <ReferentialConstraint>
             <Principal Role="UserTable">

+ 1 - 1
MyWpfApp/Pages/PageUserInfo.xaml

@@ -11,7 +11,7 @@
     <Grid>
         <StackPanel Orientation="Horizontal" >
             <StackPanel>
-                <Image Height="200" Width="200" Source="{Binding ZaglushkaPath}"/>
+                <Image Height="200" Width="200" Source="{Binding ImageBind}"/>
                 <Button x:Name="btnChangeUserImage" Content="Изменить изображение" Click="btnChangeUserImage_Click" Uid="{Binding ID}"/>
             </StackPanel>
             

+ 4 - 12
MyWpfApp/Pages/PageUserInfo.xaml.cs

@@ -96,21 +96,13 @@ namespace MyWpfApp.Pages
             //преобразуем картинку в массив байт
             byte[] bytes = (byte[])imageConverter.ConvertTo(image, typeof(byte[]));
 
-           // int IDUser = user.LoginedTable.ID;
+            //добавляем запись в таблицу с картинками и сохраняем изменения
             Globals.MyGlobalConnection.UserImages.Add(new UserImages(){IDUser = user.UserTable.ID, Image = bytes });
             Globals.MyGlobalConnection.SaveChanges();
 
-            ////преобразуем массив байт в BitmapImage (т.к. его можно помещать в ImageSource)          
-            //using (MemoryStream stream = new MemoryStream(bytes))
-            //{
-            //    var BMimage = new BitmapImage();
-            //    BMimage.BeginInit();
-            //    BMimage.CacheOption = BitmapCacheOption.OnLoad;
-            //    BMimage.StreamSource = stream;
-            //    BMimage.EndInit();
-            //    imageBindings.ImageSource = BMimage;
-            //}
+            //метод для обновления картинки
+            user.RefrashImage();
 
-        }
+         }
     }
 }

+ 1 - 1
MyWpfApp/UserImages.cs

@@ -15,7 +15,7 @@ namespace MyWpfApp
     public partial class UserImages
     {
         public int ID { get; set; }
-        public Nullable<int> IDUser { get; set; }
+        public int IDUser { get; set; }
         public byte[] Image { get; set; }
     
         public virtual UserTable UserTable { get; set; }

+ 72 - 6
MyWpfApp/models/User.cs

@@ -1,17 +1,22 @@
 using System;
 using System.Collections.Generic;
+using System.ComponentModel;
+using System.IO;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 using System.Windows;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
 
 namespace MyWpfApp.models
 {
     /// <summary>
     /// источник данных для страницы UserInfo
     /// </summary>
-    public class User
-    {        
+    public class User : INotifyPropertyChanged
+    {
+        public event PropertyChangedEventHandler PropertyChanged;
         //создаем объекты тех таблиц БД, с которыми необходмо работать (брать или добавлять данные)
         UserTable userTable;
         LoginedTable loginedTable;
@@ -24,14 +29,35 @@ namespace MyWpfApp.models
         {
             this.loginedTable = loginedTable;
             userTable = Globals.MyGlobalConnection.UserTable.FirstOrDefault(x => x.ID == loginedTable.ID);
+            
+            //получаем последнее изображение пользователя и помещаем его в источник данных для картинки на странице
+            //OrderByDescending нужен, так как в EF не работает LastOrDefault
+            UserImages userImage = Globals.MyGlobalConnection.UserImages.OrderByDescending(x=>x.ID).FirstOrDefault(x => x.IDUser == LoginedTable.ID);
+            if (userImage == null)//если у пользователя в базе нет записей об изображении
+            {
+                imageSource = null;
+            }
+            else //помещаем картинку в IageSource по известному алгоритму
+            {
+                using (MemoryStream stream = new MemoryStream(userImage.Image))
+                {
+                    BitmapImage BMimage = new BitmapImage();
+                    BMimage.BeginInit();
+                    BMimage.CacheOption = BitmapCacheOption.OnLoad;
+                    BMimage.StreamSource = stream;
+                    BMimage.EndInit();
+                    imageSource = BMimage;
+                }
+            }
         }
         /// <summary>
         /// конструктор без аргументов. Используется, если мы создаем нового пользователя
         /// </summary>
-         public User()
+        public User()
         {
             loginedTable = new LoginedTable();
-            userTable = new UserTable();  
+            userTable = new UserTable();
+            imageSource = null;
         }
 
         /// <summary>
@@ -45,9 +71,49 @@ namespace MyWpfApp.models
         public LoginedTable LoginedTable { get => loginedTable; set => loginedTable = value; }
 
 
-        string zaglushkaPath = "/Resources/zaglushka.png";
+        string imagePath = "/Resources/zaglushka.png";//путь к заглушке. не меняется в ходе выполнения программы
+        ImageSource imageSource;//источник данных для картинки. 
 
-        public string ZaglushkaPath { get => zaglushkaPath; }
+        
 
+        public object ImageBind
+        {
+            get
+            {
+                if (imageSource == null) return imagePath;//если изображения в базе нет, возвращаем путь к заглушке
+                else return imageSource;//иначе возвращаем картинку из базы
+            }
+            set//стандартно с вызовом события обновления отрисовки
+            {
+                imageSource = (ImageSource)value;
+                PropertyChanged.Invoke(this, new PropertyChangedEventArgs(nameof(ImageBind)));
+            }
+        }
+        
+        /// <summary>
+        /// метод для перевода картинки из массива байт в BitmapImage. Связан со свойством ImageBind
+        /// </summary>
+        public void RefrashImage()
+        {
+            UserImages userImage = Globals.MyGlobalConnection.UserImages.OrderByDescending(x => x.ID).FirstOrDefault(x => x.IDUser == LoginedTable.ID);
+            if (userImage == null)//если у пользователя в базе нет записей об изображении
+            {
+                ImageBind = null;
+            }
+            else //помещаем картинку в IageSource по известному алгоритму
+            {
+                using (MemoryStream stream = new MemoryStream(userImage.Image))
+                {
+                    BitmapImage BMimage = new BitmapImage();
+                    BMimage.BeginInit();
+                    BMimage.CacheOption = BitmapCacheOption.OnLoad;
+                    BMimage.StreamSource = stream;
+                    BMimage.EndInit();
+                    ImageBind= BMimage;
+                }
+            }
+            PropertyChanged.Invoke(this, new PropertyChangedEventArgs(nameof(ImageBind)));
+        }
+        
     }
 }