Diskuze: Event na kontrolovanie kontrolky TextBlock
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.


rawen:1.5.2014 14:10
Kdyř jí vytváříš cykliscky (hadam cyklem for), tak proč tam nedáš,
že třeba u 5. cyklu se vytvoří EventHandler k dané kontrolce. Nebo by to
asi i šlo, kdybys jí nastavil třeba tag podle cyklu, v kterém byla
vytvořena a pak s ní přes tag manipulovat.
Jan Vargovský:1.5.2014 14:36
"Kontrolku nie je možné pomenovať, lebo je vytvorená cyklicky spolu s ďalšími takýmito kontrolkami."
Odkud si na tohle přišel?
roks:1.5.2014 18:01
Mám ju "otagovanú"ale neviem ako s ňou manipulovať, aby sa stále
kontrolovala. A aký Event by si mi odporučil na túto moju konkrétnu
situáciu?
roks:1.5.2014 18:04
Tak neviem si predstaviť ako by som v kóde napísal, aby sa menila
kontrolka, ktorej priradím meno a ešte pred tým na ňu vložím príkaz neviem si to predstaviť, ale preto
píšem sem, lebo tu máte oveľa viac skúseností
Jan Vargovský:1.5.2014 18:21
Nevím co kontroluješ, ale jestli máš nějakou proměnnou, tak si k ní vytvoříš event a když jí budeš nastavovat, tak vyvoláš event, ve kterém změníš nějaký ten tvůj text.
Já si moc nedokážu představit o co se vlastně snažíš. Pošli kousky kódu (jak vytváříš ten textblock, kde a jak se mění hodnota)
roks:1.5.2014 18:40
Ok, kód je napísaný tak "všeliak" tak ale toto pošlem:
private void vykresliFunkcieUdalosti()
{
sp.Children.Clear();
for (int i = 0; i < App.Objekty[index].Udalosti[indexUdalosti].Funkcie.Count; i++)
{
Button btn = new Button(); btn.Tag = App.Objekty[index].Udalosti[indexUdalosti].Funkcie[i].Id;
btn.Height = 32; btn.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#FF272727"));
Grid grid = new Grid(); grid.Width = 1500;
grid.Height = 24; grid.Tag = App.Objekty[index].Udalosti[indexUdalosti].Funkcie[i].Id;
Image image = new Image();
image.Source = konvertujBmp(Gamenator_1._0.Properties.Resources.create);
image.Width = 24; image.Height = 24; image.HorizontalAlignment = System.Windows.HorizontalAlignment.Left; image.VerticalAlignment = System.Windows.VerticalAlignment.Center; image.Margin = new Thickness(10, 0, 0, 0); grid.Children.Add(image);
TextBlock text = new TextBlock(); text.HorizontalAlignment = System.Windows.HorizontalAlignment.Left; text.VerticalAlignment = System.Windows.VerticalAlignment.Center; text.Margin = new Thickness(50, 0, 0, 0); text.Foreground = new SolidColorBrush(Colors.White); grid.Children.Add(text);
text.FontSize = 14; text.Foreground = new SolidColorBrush(Colors.White); text.FontSize = 14;
string funkcia = App.Objekty[index].Udalosti[indexUdalosti].Funkcie[i].Kod;
string[] pole = Regex.Split(funkcia, "<■m■e■d■z■e■r■a■>");
if (pole[0] == "<■create■>")
{
text.Text = "Vytvoriť objekt";
TextBlock textObjekt = new TextBlock(); textObjekt.HorizontalAlignment = System.Windows.HorizontalAlignment.Left; textObjekt.VerticalAlignment = System.Windows.VerticalAlignment.Center; textObjekt.Margin = new Thickness(180, 0, 0, 0); textObjekt.Foreground = new SolidColorBrush(Colors.White); grid.Children.Add(textObjekt); text.FontSize = 12;
var vyberObj = App.Objekty.SingleOrDefault(x => x.Id == Convert.ToInt32(pole[1]));
if (vyberObj != null)
textObjekt.Text = vyberObj.Meno;
else
textObjekt.Text = "null";
textObjekt.Tag = App.Objekty[index].Udalosti[indexUdalosti].Funkcie[i].Id + "■1■4";
Border brd = new Border(); ImageBrush pridajObr = new ImageBrush(); pridajObr.ImageSource = konvertujBmp(Gamenator_1._0.Properties.Resources.create);
brd.HorizontalAlignment = System.Windows.HorizontalAlignment.Left; brd.VerticalAlignment = System.Windows.VerticalAlignment.Center;
brd.MouseLeave += new MouseEventHandler(brd_MouseLeave); brd.Tag = App.Objekty[index].Udalosti[indexUdalosti].Funkcie[i].Id + "■1■4";
Grid btnObr = new Grid(); btnObr.Height = 16; btnObr.Width = 16;
btnObr.Background = pridajObr; brd.Child = btnObr;
brd.MouseMove += new MouseEventHandler(brd_MouseMove); brd.MouseUp += brd_MouseUp; brd.MouseDown += brd_MouseDown; brd.MouseEnter += brd_MouseEnter;
brd.Height = 18; brd.Width = 18; brd.BorderBrush = new SolidColorBrush(Colors.Transparent); brd.BorderThickness = new Thickness(1, 1, 1, 1); brd.Margin = new Thickness(225, 0, 0, 0);
grid.Children.Add(brd);
TextBlock textX = new TextBlock(); textX.HorizontalAlignment = System.Windows.HorizontalAlignment.Left; textX.VerticalAlignment = System.Windows.VerticalAlignment.Center; textX.Margin = new Thickness(270, 0, 0, 0); textX.Foreground = new SolidColorBrush(Colors.White); grid.Children.Add(textX); textX.Text = "X:"; textX.FontSize = 12;
TextBlock textY = new TextBlock(); textY.HorizontalAlignment = System.Windows.HorizontalAlignment.Left; textY.VerticalAlignment = System.Windows.VerticalAlignment.Center; textY.Margin = new Thickness(360, 0, 0, 0); textY.Foreground = new SolidColorBrush(Colors.White); grid.Children.Add(textY); textY.Text = "Y:"; textY.FontSize = 12;
TextBlock textZ = new TextBlock(); textZ.HorizontalAlignment = System.Windows.HorizontalAlignment.Left; textZ.VerticalAlignment = System.Windows.VerticalAlignment.Center; textZ.Margin = new Thickness(450, 0, 0, 0); textZ.Foreground = new SolidColorBrush(Colors.White); grid.Children.Add(textZ); textZ.Text = "Z:"; textZ.FontSize = 12;
TextBox tbX = new TextBox(); tbX.HorizontalAlignment = System.Windows.HorizontalAlignment.Left; tbX.VerticalAlignment = System.Windows.VerticalAlignment.Center; tbX.Margin = new Thickness(290, 0, 0, 0); tbX.Foreground = new SolidColorBrush(Colors.White); tbX.Tag = App.Objekty[index].Udalosti[indexUdalosti].Funkcie[i].Id + "■2■4";
tbX.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#FF272727")); tbX.BorderBrush = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#59616C")); grid.Children.Add(tbX); tbX.Height = 20; tbX.Width = 60; tbX.FlowDirection = System.Windows.FlowDirection.LeftToRight; tbX.Text = pole[2]; tbX.TextChanged += textoveBoxy_TextChanged;
TextBox tbY = new TextBox(); tbY.HorizontalAlignment = System.Windows.HorizontalAlignment.Left; tbY.VerticalAlignment = System.Windows.VerticalAlignment.Center; tbY.Margin = new Thickness(380, 0, 0, 0); tbY.Foreground = new SolidColorBrush(Colors.White); tbY.Tag = App.Objekty[index].Udalosti[indexUdalosti].Funkcie[i].Id + "■3■4";
tbY.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#FF272727")); tbY.BorderBrush = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#59616C")); grid.Children.Add(tbY); tbY.Height = 20; tbY.Width = 60; tbY.FlowDirection = System.Windows.FlowDirection.LeftToRight; tbY.Text = pole[3]; tbY.TextChanged += textoveBoxy_TextChanged;
TextBox tbZ = new TextBox(); tbZ.HorizontalAlignment = System.Windows.HorizontalAlignment.Left; tbZ.VerticalAlignment = System.Windows.VerticalAlignment.Center; tbZ.Margin = new Thickness(470, 0, 0, 0); tbZ.Foreground = new SolidColorBrush(Colors.White); tbZ.Tag = App.Objekty[index].Udalosti[indexUdalosti].Funkcie[i].Id + "■4■4";
tbZ.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#FF272727")); tbZ.BorderBrush = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#59616C")); grid.Children.Add(tbZ); tbZ.Height = 20; tbZ.Width = 60; tbZ.FlowDirection = System.Windows.FlowDirection.LeftToRight; tbZ.Text = pole[4]; tbZ.TextChanged += textoveBoxy_TextChanged;
}
btn.Content = grid;
sp.Children.Add(btn);
}
}
chcem vlastne zmeniť hodnotu z kontextového menu (meno objektu), ktoré sa otvorí po kliknutí na border (po nadídení naň)
MenuItem item = sender as MenuItem;
var vyberObj = App.Objekty.SingleOrDefault(x => x.Meno == item.Header);
if (vyberObj != null)
{
string[] pole = item.Tag.ToString().Split('■');
var vyberUdalost = App.Objekty[index].Udalosti[indexUdalosti].Funkcie.SingleOrDefault(y => y.Id == Convert.ToInt32(pole[0]));
if (vyberUdalost != null)
{
string[] poleUdalosti = Regex.Split(vyberUdalost.Kod, "<■m■e■d■z■e■r■a■>");
poleUdalosti[Convert.ToInt32(pole[1])] = vyberObj.Id.ToString();
string funkcia = "";
for (int i = 0; i < Convert.ToInt32(pole[2]); i++)
{
funkcia += poleUdalosti[i];
funkcia += "<■m■e■d■z■e■r■a■>";
}
funkcia += poleUdalosti[Convert.ToInt32(pole[2])];
vyberUdalost.Kod = funkcia;
}
}
neviem či to takto pochopíš, o čo sa asi jedná, ale hádam hej
Jan Vargovský:1.5.2014 18:47
Přepiš to tak, aby se v tom dalo číst. Je tam plno redudantního kódu, který by šel pěkně zredukovat. Minimálně aspoň upravit kód, aby jsi neměl na řádku 400 znaků...
David Hartinger Máš tu trošku error
Jan Vargovský:1.5.2014 20:02
Přepiš kód, pak se ho možná budu snažit pochopit a můžu ti poradit
Onehdá jsem si dělal něco podobného. Dělal jsem to teda přes
FlowLayoutPanel (WF), kde jsem si cyklem vygeneroval 6comboboxu a pomocí tagu -
čísla cyklu při generování jsem si do comboboxu nahraval itemy. Přičemž
jsem si při vytvoření comboboxu generoval i událost na změnu itemu. Takže
když mě někdo u jednoho změnil hodnotu, tak se zavolala událost.
Představuju si to tak, že pokudpotřebuješ událost jen u jednoho, tak si v
cyklu dáš podmínku - třeba pokud počet cyklu se rovna nějakému číslu,
tak vytvoř událost pro onu kontrolku.
Včera som tu nebol, tak som nemohol odpísať, vďaka za rady vytvoril som si funkciu, ktorá mi
zistí daný objekt (v mojom prípade TextBlock) a uloží ho do premenne
kontrolkaTextBlock. Kód vyzerá asi takto:
private object oznacenyObjekt(object sender)
{
Border border = sender as Border;
Grid grid = border.Parent as Grid;
UIElementCollection kolekcia = grid.Children;
TextBlock text = kolekcia[2] as TextBlock;
return text;
}
a potom už len do TextBlocku zapíšem môj text, ale vďaka vám za
užitočné rady
Zobrazeno 13 zpráv z 13.