【问题标题】:How to save UIElements in a Database and restore them later?如何将 UIElements 保存在数据库中并在以后恢复它们?
【发布时间】:2013-08-14 13:25:24
【问题描述】:

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

因此,当您每次绘制某些内容时,都会将一个新的路径元素作为子元素添加到我的 Grid 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 对象另存为字符串并稍后解析它们来做到这一点?这里的最佳做法是什么?

【问题讨论】:

    标签: c# sql xaml uielement


    【解决方案1】:

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

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

    像这样:XAML Serialization

    【讨论】:

    • 感谢您的回答,您建议的解决方案对我有用。我将它与 ItemsControl 一起使用。我在这里完成后会发布我的解决方案
    • 好的,我必须再次更正我的答案,遗憾的是 XamlWriter 在 Metro 风格应用程序中不可用。所以我需要找到另一种方法来序列化我的路径......
    【解决方案2】:

    由于目前没有可用于 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&lt;Windows.UI.Xaml.Shapes.Path&gt;

    稍后可以通过循环内的代码使用生成的字符串来重建您保存的路径。也许值得一提的是,您不应该忘记 XamlReader 的命名空间,因为这给我带来了很多问题。

    this._notePaths.Add((Windows.UI.Xaml.Shapes.Path)XamlReader.Load(item.PathObject));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-30
      • 2019-11-06
      • 2013-06-22
      • 1970-01-01
      相关资源
      最近更新 更多