2017-04-22 38 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将正确地编写持久性字符串数据,这将允许在前端和数据库之间进行图像识别。好主意。谢谢。 –

相关问题