Je viens vers vous car je bute sur un problème de conception de mon objet.
Topo : Je développe un petit logiciel pour pouvoir crée des diapo de cours . Du coup l'utilisateur doit pouvoir en cliquant sur un bouton faire apparaitre l’élément type qu'il désire remplir (texte, image, video ....) modifié son emplacement et sa taille et que toute ces infos soit exportable via un objet sérialisé pour être lu dans un player par la suite.
Tout fonctionne correctement (taille, emplacement) sauf que pour la sauvegarde des donnée de l'objet ( du texte RTF en l’occurrence ) la méthode pour que les données soit passé a l'objet est un peu moche et nécessite que l'utilisateur fasse un ctrl+S en étant sur l'objet. Du coup j'ai essayée plusieurs méthodes (qui ne me satisfont pas) et je me demande si ce n'est pas la conception mm de mon objet qui est mal foutu.
Ici la classe Mère
public class ElementDiap
{
#region Parametre : Generaux
//Data set or not
public string DNS_DS { get; set; }
// taille elem H+W
public double Heightt { get; set; }
public double widhtt { get; set; }
//Name elem ( facult )
public string name { get; set; }
// Margin elem
public double PlaceL;
public double PlaceT;
public double PlaceR;
public double PlaceB;
// delta pour size
public Point Delta;
#endregion
// appel vide
public ElementDiap()
{ }
#region Methode Commune ( resize + deplacement elem)
// Methode deplacement + resize avec souris pour chaque élémentdiap.
public void MOOve(object sender, MouseEventArgs e)
{
Control sendercont = (Control)sender;
if (e.LeftButton == MouseButtonState.Pressed && Keyboard.IsKeyDown(Key.LeftCtrl))
{
TranslateTransform transform = new TranslateTransform();
transform.X = e.GetPosition(sendercont.Parent as FrameworkElement).X;
transform.Y = e.GetPosition(sendercont.Parent as FrameworkElement).Y;
sendercont.Margin = new Thickness( transform.X, transform.Y,0,0);
PlaceL = sendercont.Margin.Left;
PlaceT = sendercont.Margin.Top;
PlaceR = sendercont.Margin.Right;
PlaceB = sendercont.Margin.Top;
}
if (e.LeftButton == MouseButtonState.Pressed && Keyboard.IsKeyDown(Key.LeftAlt))
{
double XXVerif = (Delta.X + e.GetPosition(sendercont.Parent as FrameworkElement).X) - sendercont.Margin.Left;
double YYVerif = (Delta.Y + e.GetPosition(sendercont.Parent as FrameworkElement).Y) - sendercont.Margin.Top;
if (XXVerif > 2 && YYVerif > 2)
{
sendercont.Height = YYVerif;
sendercont.Width = XXVerif;
Heightt = sendercont.Height;
widhtt = sendercont.Width;
}
}
}
// methode pour fixe Delta pour resize
public void MsDown(object sender, MouseButtonEventArgs e)
{
Control sendercont = (Control)sender;
Delta.X = e.GetPosition(sendercont.Parent as FrameworkElement).X ;
Delta.Y = e.GetPosition(sendercont.Parent as FrameworkElement).Y ;
}
#endregion
#region Methode : A override
// Methode mere a Over ride
public virtual void setData(Control ctrl )
{
}
public virtual void upData()
{ }
public virtual void DataSetOrNot()
{
}
public virtual void Opening(Grid gridouadd)
{ }
#endregion
}
Et ici la classe fille pour un élément de diapo type texte
[Serializable]
public class TXTelem : ElementDiap
{
#region : Parametre TXTelem
public string Data { get; set; } // data de la richtextbbox
#endregion
#region : Constructeur (Créa + Opening)
// Constructeur Creation
public TXTelem(Grid GridOuADD)
{
RichTextBox tmp = new RichTextBox();
//event recurs
tmp.MouseDown += MsDown;
tmp.PreviewMouseMove += MOOve;
// tmp.KeyDown += setData;
//param depart
tmp.HorizontalAlignment = HorizontalAlignment.Left;
tmp.VerticalAlignment = VerticalAlignment.Top;
tmp.Height = 100;
tmp.Width = 100;
Heightt = 100;
widhtt = 100;
PlaceL = tmp.Margin.Left;
PlaceT = tmp.Margin.Top;
PlaceR = tmp.Margin.Right;
PlaceB = tmp.Margin.Top;
GridOuADD.Children.Add(tmp);
DataSetOrNot();
}
#endregion
#region : Fonction ( ovverride + propre)
// set DATA
public override void setData(Control ctrl)
{
RichTextBox rtb = (RichTextBox)ctrl;
// RichTextBox rtb = RTB;
string tmp;
TextRange textRange = new TextRange(rtb.Document.ContentStart, rtb.Document.ContentEnd);
if (textRange.Text != "" && textRange.Text != "\r\n")
{
MemoryStream ms = new MemoryStream();
textRange.Save(ms, System.Windows.DataFormats.Rtf);
tmp = ASCIIEncoding.Default.GetString(ms.ToArray());
ms.Close();
Data = tmp;
DataSetOrNot();
}
else
{
tmp = "";
Data = tmp;
DataSetOrNot();
}
}
Ducoup pour l'objet TXTelem qui crée une richtextbox la methode SetData ( si je change les argument en objet sender et keyeventarg e ) fonctionne bien avec le richtextboc.keydown += SetData; mais coté utilisateur c'est un peu lourds de se positionné sur chaque element et de faire un ctrl+S
j'essaye donc de faire en sorte que la methode SetData prenne un control en argument et de faire en sorte de pouvoir l'appelée coté interface avec un bouton au autre pour pouvoir enregistrer les data de tous les élément crée en un coup.
avec quelque chose du genre :
foreach ( Elemendiap item in listDeDiap)
{
item.SetData()
}
PS : l'objet devant etre sérialisable je ne peut pas declaré un parametre richtextbox dans mon objet (le compilateur me dit que la classe control n'est pas sérialisable )
PS2 : Je sent bien qu'il ya quelque chose dans la logique de mon objet qui n'est pas bonne mais j'arrive pas a voir par ou m'en sortir.
Merci par avance pour vos réponse.
Objet et recuperation de donnée[C#][WPF].
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.