2017-04-22 28 views
2

在WPF中,我有被丟棄到一個InkCanvas並添加作爲一個孩子的圖像:如何使用大小,位置和旋轉來保存圖像,然後進行恢復?

ImageInfo image_Info = e.Data.GetData(typeof(ImageInfo)) as ImageInfo; 
     if (image_Info != null) 
     { 
      Image image = new Image(); 
      image.Width = image_Info.Width * 4; 
      image.Stretch = Stretch.Uniform; 
      image.Source = new BitmapImage(image_Info.Uri); 
      Point position = e.GetPosition(ic); 

      InkCanvas.SetLeft(image, position.X); 
      InkCanvas.SetTop(image, position.Y); 
      ic.Children.Add(image); 
    } 

然後通過裝飾器的方式,圖像移動和調整大小。然後它堅持到數據庫爲:

public List<string> Children; 

var uiList = ic.Children.Cast<UIElement>().ToList(); 
      foreach (var p in uiList) 
      { 
       string uis = System.Windows.Markup.XamlWriter.Save(p); 
       s.Add(uis); 
      } 
      Children = s; 

然後孩子被髮送到數據庫。在數據庫中得到的記錄顯示爲:

"<Image Source="pack://application:,,,/Images/Female - Front.png" Stretch="Uniform" Width="Auto" InkCanvas.Top="296" InkCanvas.Left="695" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" /> " 

有到新的位置,大小,或者圖像的旋轉沒有參考 - 只有它的初始滴點。使用xmlreader重新創建圖像會將圖像恢復爲其初始放置點和大小。

foreach (string s in behavior.Children) 
      { 
       var stringReader = new StringReader(s); 
       var xmlReader = System.Xml.XmlReader.Create(stringReader, new System.Xml.XmlReaderSettings()); 

       Image b = (Image)System.Windows.Markup.XamlReader.Load(xmlReader); 
       ic.Children.Add(b); 
      } 

(圖像源打包爲應用程序資源)。

如何將圖片的大小,位置和旋轉持久化然後恢復?

TIA。

+0

您不應該序列化和反序列化XAML。使用描述當前視圖的所有必要數據更好地創建適當的模型類。然後加載並保存該模型類的實例。 – Clemens

回答

1
  1. 要麼你可以添加額外的字段到你的數據庫表大小/位置/旋轉和存儲信息那裏。

  2. 或者,您可以將這些字段一起添加爲逗號(,)分隔並存儲在您的Image控件的Tag字段中。 <Image Tag="(120,230);(50,50);(-30)" ... />

您也可以整個操作的圖片保存爲DB byte[]

請告訴您這是否解決您的問題。

+0

事實證明,上述代碼一旦裝飾者被刪除,就能正常工作。但是,我真的很喜歡你的想法,即將附加信息作爲字符串存儲在標籤中。我相信xamlwriter將正確地編寫持久性字符串數據,這將允許在前端和數據庫之間進行圖像識別。好主意。謝謝。 –

相關問題