Serialisation d'une instance de la classe shapes.line
Salut la communauté.
Mon problème c'est que j'arrive pas à sérialiser des objets du type shapes.line, et je me demandais si il y'aurait pas un moyen d'y arriver.
Quand j'essaie, je reçois immanquablement ce message:
Citation:
Le type 'System.Windows.Shapes.Line' dans l'assembly 'PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' n'est pas marqué comme sérialisable.
Shapes.line n'étant pas héritable, je vois pas comment faire pour lui ajouter l'attribut <serializable>.
Merci d'avance
serialiser un membre de la classe shape
bonjour,la classe shape ancetre est un controle dote de toutes fonctionnalites de binding et d'evenements c'est un controle UI et les controles UI ne sont pas serialisables.
if faut lui associer un classe wrapper pour stocker les proprietes des shapes et implementer cette classe comme serialisable.
ensuite à l'utilisation :
-on serialiase cette classe et sa liste d'objet en ecriture.
-a la lecture on lit cette classe et sa liste ensuite on recree les shapes.
Si tu utilise la classe Geometry oui mais elle "freezable" ( ne gere pas le binding et les evenemenements),idem pour les DrawingVisual qui supporte un seul type d'evenements (HitTest).
bon code....
shapes.line,shapes,heritage
bonjour,
Herites de shapes.shape , pas de shapes.line
doc:Public NotInheritable Class Line
Inherits System.Windows.Shapes.Shape
Membre de System.Windows.Shapes
Voici un exemple de classe figure rectangle ca pourrait etre une ellipse etc...
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
|
<Serializable()> _
Public Class figureRectangle
Inherits Shapes.Shape
Dim m_largeur As Double
Dim m_hauteur As Double
Protected Overrides Function ShouldSerializeProperty(ByVal dp As System.Windows.DependencyProperty) As Boolean
Return MyBase.ShouldSerializeProperty(dp)
End Function
Public Sub New()
End Sub
Public Sub New(ByVal xwidth As Double, ByVal xheight As Double)
Me.m_largeur = xwidth
Me.m_hauteur = xheight
End Sub
Public Sub New(ByVal xrect As Rect)
Me.m_largeur = xrect.Width
Me.m_hauteur =xrect.Height
End Sub
Public Property Largeur() As Double
Get
Return m_largeur
End Get
Set(ByVal value As Double)
m_largeur = value
End Set
End Property
Public Property Hauteur() As Double
Get
Return m_hauteur
End Get
Set(ByVal value As Double)
m_hauteur = value
End Set
End Property
Protected Overrides ReadOnly Property DefiningGeometry() As System.Windows.Media.Geometry
Get
Dim monRect = New Rect(0, 0, Largeur, Hauteur)
Dim fig As System.Windows.Media.RectangleGeometry = New System.Windows.Media.RectangleGeometry
fig.Rect = monRect
Return fig
End Get
End Property
End Class |
Voici un test dans une fenetre xaml qui utilise cette figure:
Code:
1 2 3 4 5 6 7 8 9 10 11 12
|
<Window x:Class="Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfAppSerialize"
Title="Window1" Height="300" Width="300">
<Grid Height="267" Width="284">
<local:figureRectangle Largeur="20" Hauteur="20" StrokeThickness="2" Stroke="Black" Fill="Aquamarine" Height="24" VerticalAlignment="Bottom" Margin="128,0,130,91" />
<local:figureRectangle Largeur="20" Hauteur="20" StrokeThickness="2" Stroke="Red" Fill="Blue" Margin="0,101,89,0" HorizontalAlignment="Right" Width="25" Height="26" VerticalAlignment="Top" />
</Grid>
</Window> |
bon je pense à autre chose,si c'est des figures prototopes pourquoi ne pas les creer comme des shapes normales dans un assembly de style .
Ensuite tu en creera autant que tu veux.
bon code...