如何在数据库中保存UIElements并在以后恢复它们?

时间:2013-08-14 13:25:24

标签: c# sql xaml uielement

想象一下,我创建了一个应用程序,可以让您在网格中绘制路径。

因此,每次绘制内容时,都会将新的路径元素作为子元素添加到我的网格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对象保存为字符串并稍后解析它来实现此目的?什么是最好的做法?

2 个答案:

答案 0 :(得分:1)

尝试序列化XAML-Control并将其作为字符串保存到数据库中。 之后您可以像这样加载它:

UIElement cXamlElements = (UIElement)XamlReader.Parse("MY XAML CODE");

像这样:XAML Serialization

答案 1 :(得分:0)

由于今天没有可用于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));