想象一下,我创建了一个应用程序,可以在网格中绘制路径。
因此,每次绘制某个内容时,都会将一个新的路径元素作为子元素添加到我的网格UI元素中。
因此,这是我在绘制之前的网格:
<Grid x:Name="myGrid" Grid.Row="0" PointerMoved="myGrid_PointerMoved" PointerPressed="myGrid_PointerPressed" PointerReleased="myGrid_PointerReleased" ></Grid>
当你画一些东西时,以下内容会被编程添加为上面网格的子元素:
<Path Stroke="Black" StrokeThickness="1">
<Path.Data>
<PathGeometry>
<PathFigure StartPoint="10,50">
<LineSegment Point="200,70" />
</PathFigure>
</PathGeometry>
</Path.Data>
</Path>
因此,每一个新的绘制动作都会添加一条路径,就像这条路径一样,作为我网格的子路径。
现在,我想在我的SQL数据库中保存早期创建的路径,以便以后恢复它们,但我不知道如何在我的SQL数据库中保存xml XAML UI元素,然后再恢复它。
是否可以通过绑定或将我的XAML对象保存为字符串并稍后进行解析来完成此操作?这里的最佳做法是什么?
尝试序列化XAML控件并将其作为字符串保存到数据库中。稍后你可以这样加载:
UIElement cXamlElements = (UIElement)XamlReader.Parse("MY XAML CODE");
像这样:XAML序列化
由于目前还没有适用于metro应用程序的XamlWriter,我为Paths创建了自己的序列化方法。
如果有人感兴趣,这是我的方法:
foreach (Windows.UI.Xaml.Shapes.Path path in this._notePaths.Where(myPath => this._newPaths.Contains(myPath)).ToObservableCollection() )
{
String myPathObjectString = String.Empty;
myPathObjectString += @"<Path" + " xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"" + @" Stroke=""" + ((SolidColorBrush)this._notePaths.LastOrDefault().Stroke).Color.ToString()
+ @""" StrokeThickness=""" + path.StrokeThickness + @"""><Path.Data><PathGeometry><PathFigure StartPoint="""
+ ((int)((PathGeometry)path.Data).Figures.FirstOrDefault().StartPoint.X) + "," + ((int)((PathGeometry)path.Data).Figures.FirstOrDefault().StartPoint.Y) + @""">";
foreach (LineSegment item in ((PathGeometry)path.Data).Figures.FirstOrDefault().Segments)
{
myPathObjectString += @"<LineSegment Point=""" + (int)item.Point.X + "," + (int)item.Point.Y + @""" />";
}
myPathObjectString += @"</PathFigure></PathGeometry></Path.Data></Path>";
}
_notePaths是一个ObservableCollection<Windows.UI.Xaml.Shapes.Path>
。
生成的字符串稍后可以通过循环中下面的代码使用,以重建保存的路径。也许值得一提的是,你不应该忘记XamlReader的命名空间,因为这给我带来了很多问题
this._notePaths.Add((Windows.UI.Xaml.Shapes.Path)XamlReader.Load(item.PathObject));