10. oktober 2007 - 01:57Der er
9 kommentarer og 1 løsning
OnRender i WPF
Så er man kommet dertil hvor man lige skal se hvad det presentation foundation er for noget og er derfor igang med at skrive et 'gammlet' program om i WPF. Men jeg er stød ind i et lille problem som måske en af jer kan hjælpe mig. I første omgang skal jeg bare have tegnet en rektangel på en canvas, men der er det lille twist at jeg gerne vil bruge OnRender eventen til at tegne min rektangel. Spørgsmålet er hvordan jeg for den til at 'male' på canvas'en. Her er den kode jer er nået frem til so far. class Drawingboard : Window { private Canvas board; private Square square1;
public Drawingboard() { Title = "Drawing board"; board = new Canvas(); board.Height = board.Width = Width = Height = 400; board.Background = Brushes.Blue; Content = board; }
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
I modsætning til en "gammeldags" Forms applikation bliver OnRender i WPF ikke kaldt særlig tit. Faktisk (vist) kun når formen vises første gang, og så når du selv kalder:
InvalidateVisual()
Resten af tiden bruges der en cachet version. Dette har noget at gøre med den måde grafik accelereringen virker i WPF.
Hej, sorry jeg ikke lige fulgte op på mit spørgsmål, men en anden opgave overtog lidt mit focus på WPF. Men kan du sige noget om hvor ofte OnRender bliver kaldt eller hvad kan evt. ellers skulle bruge istedet for ?
Jeg har vist allerede fortalt hvornår OnRender kaldes. :^)
Den rigtige metode er at bruge OnRender, så du er ikke på vej galt i byen med din kode. Du skal blot være klar over at du selv skal kalde InvalidateVisual() når du vil have opdateret med nyt indhold.
Ok, så OnRender bliver altså kun kaldt ved invalidateVisual. Derfor prøvede jeg at kalde invalidateVisual() som det sidste i constructer'en men der kommer stadig ingen firkant. Det jeg grubler lidt over er at OnRender kommer fra Window classen, det vil vel sige at den skriver på Drawingboard (hvilket den jo saa alligevel ikke gør) og ikke på canvas'en som jeg gerne vil have den til. Canvas'en har jo også sit eget DrawingContext (hvis jeg husker rigtigt) så det hele er pt. lidt forvirrende. Hvis du kunne/har tid til at illustrere hvordan mit eksemple udføres korrekt ville det være super :D Hvis ikke saa skal jeg nok vende tilbage når jeg har fået det til at virke saa andre måske kan få gavn af det. Er jo ikke meget man ser til WPF (endnu ?). Har faktisk lige købt en bog (MS application: code+markup. A guide to WPF), så håber den kan kaste lidt lys på hvordan hele drawing systemet er skruget sammen.
Super, det ser jo fint ud. Det ligner også lidt det der står i min bog. Er pt ved at se hvordan jeg gruppere grafiske objekter. I det 'gamle' c# benyttede jeg mig af composite pattern til at holde styr på min grafiske objekter, men WPF har noget content holder som muligvis gør det samme. Anyways saa smid et svar så du kan få lidt point. Vil stadig vende tilbage med min version naar jeg kommer dertil :D
class MySquare { public void draw(DrawingContext dc){ dc.DrawRectangle(Brushes.Blue, null , new Rect(10, 10, 10, 10))); } }
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.