Toon posts:

[XAML] bind data aan Canvas object

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
is het mogelijk om objecten of data te binden aan een Canvas object in XAML? in onderstaande voorbeelden werkt het zel om een Image dynamisch te binden aan een object en om een Root van een file te tonen in een gridviewcolumn. Maar ik wil dus een ellipse object binden aan een canvas. maar het ellipse object moet tijdens runtime gebind worden via de XAML opmaak. het kan niet via de canvas 'name' property omdat de canvas in een DataTemplate zit

<Image Width="Auto" Height="Auto" Source="{Binding Path=Image}" />

<GridViewColumn DisplayMemberBinding="{Binding Path=Root}" Header="Root" Width="100" />


bedankt voor de hulp

Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Als eerste moet je de DataContext van het window of usercontrol zetten.
Image eist een ImageSource. De standard ImageSourceConverter kan geen objecten uit de System.Drawing.* namespace omzetten naar de WPF varianten. Dit komt omdat System.Drawing volledig op GDI+ leunt, terwijl WPF juist elke vorm van OS binding probeert te voorkomen. Dat maakt het gemakkelijker om WPF naar andere platformen te porten (denk aan Linux en OSX).

Want je zult moeten doen is je (bitmap) image omzetten naar een BitmapSource.
Als eerst zul je de bitmap moeten saven naar een memorystream. De stream kun je vervolgens eenvoudig toewijzen naar een BitmapSource

C#:
1
2
3
4
5
6
7
8
9
10
11
Bitmap bmp = new Bitmap(80,80); //just creating a sample bitmap
MemoryStream ms = new MemoryStream();
bmp.Save(ms, ImageFormat.Png);

ms.Seek(o, SeekOrigin.Begin); //rewind pointer
BitmapSource bmpSource = new BitmapSource();
bmpSource.BegintInit();
bmpSource.SourceStream = ms;
bmpSource.EndInit();

ms.Close();


Je kunt nu bmpSource toewijzen aan een WPF image control. Bovenstaand kun je ook in een IValueConverter plaatsen als je meerdere Bitmaps wilt toewijzen.

Een alternatief is om je image als een tijdelijk bestand op te slaan en het path als source op te geven.

Binding is een key component van WPF (DependencyObject om precies te zijn) en is altijd mogelijk.

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
bedankt voor de reactie, maar het probleem is dat ik geen bitmap heb. dat van die image in mijn preview was slechts een voorbeeld van iets dat ik al heb en dat ook al werkt.

Wat ik concreet wil is een object tonen in een canvas. en dat tonen zou moeten gebeuren via binding. dus, ik wil tekenen op een canvas via binding. maar de figuur/grafiek wat wordt getekend wordt pas at-runtime gemaakt via een andere class die bepaalde coordinaten bevat. dus ik zou niet eerst die coordinaten willen saven naar een bitmap maar rechtstreeks tonen op mijn canvas.


ONGEVEER zoals onderstaand voorbeeld. enkel ik weet nog niet hoeveel Lines, Ellipses, ed. ik ga hebben tijdens runtime

<Canvas>
<Ellipse Fill="Salmon" Width="40" Height="40" />
<Ellipse Fill ="LightYellow" Width ="20" Height="20"
Canvas.Left="10" Canvas.Top="1"/>
</Canvas>

[ Voor 16% gewijzigd door Verwijderd op 07-04-2009 11:50 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Als je je figuur/grafiek in code maakt, waarom voeg je deze dan ook niet in code toe aan je Canvas? Of mis ik allerlei belangrijke informatie?

Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Binding is niet meer dan een vervanging van hardcoded waardes. Je zou een ItemsPresenter kunnen gebruiken om in een loop de collectie van ellipsen (met hun coordinaten) te tonen. De ItemsSource van de presenter is dan je collectie en Ellipse is dan de item template.

Bindings in code zetten voor een 'readonly' collectie lijkt mij alleen maar overhead. Wel kun je via code je canvas opbouwen zoals spurnd al aangaf.

In plaats van de canvas as source (DrawingImage) voor een Image control te zetten, kun je het canvas ook 'standalone' neerzetten.

Maar het blijft een beetje onduidelijk wat je nu precies wilt..

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

  • Koen_R
  • Registratie: Juni 1999
  • Laatst online: 10:59
Misschien heb ik het ook niet goed begrepen maar kan je niet gewoon
canvas.children.add(ellipse) of iets dergelijks doen?

En evt. met canvas.setleft en canvas.settop coordinaten instellen?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Koen Rotteveel schreef op dinsdag 07 april 2009 @ 13:37:
Misschien heb ik het ook niet goed begrepen maar kan je niet gewoon
canvas.children.add(ellipse) of iets dergelijks doen?

En evt. met canvas.setleft en canvas.settop coordinaten instellen?
nee, aangezien de canvas in een datatemplate zit. en daarom heb ik geen manier gevonden om die canvas te bereiken via code.

en voor wie niet begrijpt wat ik precies wil zal ik het proberen duidelijker uit te leggen:

ik heb een listview in een WPF form. die listview bestaat uit kolommen. iedere kolom heeft een waarde die wordt gebind via een class. maar al die waardes zijn strings of images en kan ik dus makkelijk binden. maar 1 kolom is een preview kolom. en die kolom toont een preview van ellipsen die bepaald zijn in een andere class(een class die coordinaten bevat). en die ellipsen wil ik dus renderen in mijn listview in een previewKolom. en die kolom is een gridviewColumn en die gridviewColumn bevat een datatemplate. en in deze template zit mijn canvas waar ik mijn preview op wil tonen

dus: listview>gridview>gridviewcolumn>datatemplate>canvas

ik ga zeker eens die itempresenter proberen...

ik hoop dat het duidelijk is, het is niet makkelijk uit te leggen dus zal het ook niet makkelijk te begrijpen zijn. maar bedankt voor de hulp alvast.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ik heb een oplossing gevonden... het werkt blijkbaar wel met een Contentpresenter en de content property. hier heb ik dan via de code behind een Canvas met mijn grafiek op kunnen teruggeven...


<ContentPresenter Width="30" Height="30" Content="{Binding Path=tt}" />


bedankt voor de hulp allemaal
Pagina: 1