Domanda

Nell'elaborare un gruppo di elementi, volevo visualizzare un'immagine unificata dello stato del gruppo, quindi ho essenzialmente creato una griglia di un numero di barre di avanzamento con sfondi trasparenti e vari primi piani colorati tutti nella stessa cella.

 immagine di esempio

Mi imbatto in alcuni artefatti di trasparenza (la barra viola è in realtà viola sotto il verde, e talvolta disegna sopra, ecc.) e sembra solo un po 'dispendiosa. Così, ho deciso di crearne uno mio, ma ora ho un po 'di paralisi su come farlo. Uso il DrawingContext in OnRender di FrameworkElement o c'è qualcosa di più semplice? Esiste una serie di regole generali quando si tratta di prendere il proprio controllo?

Ho riflettuto sul passaggio a un grafico a torta poiché quelli sono facili da trovare, ma è giunto il momento che ho fatto qualcosa di non standard.

Grazie!

È stato utile?

Soluzione

Non sono del tutto sicuro di come intendi che la barra di avanzamento combini diversi progressi, ma se dicessi che il progresso più lontano è nella parte inferiore dell'indice z e il minimo lungo è nella parte superiore, allora lo farei qualcosa del genere:

1) Probabilmente creerei un controllo utente per questa nuova barra di avanzamento.

2) Avrebbe una proprietà chiamata NumberOfProgresses, che è legata a un array contenente lo stato di tali progressi.

3) Ogni progresso sarebbe rappresentato da un oggetto Border (o forse qualcosa di più adatto all'albero visivo), perché è un semplice controllo wpf con una proprietà background. La proprietà background dovrebbe essere impostata su uno stile progressivo dall'aspetto gradevole e il colore progressivo può essere associato allo stile per dire la proprietà borderbrush del bordo. Semplificando l'impostazione del colore del progresso.

4) Il controllo utente avrebbe un metodo UpdateProgress che prende come parametro il valore percentuale e l'indice dello stato di avanzamento dell'array.

5) Man mano che i progressi vengono aggiornati, puoi semplicemente calcolare la larghezza appropriata (larghezza effettiva * percentuale controllo utente) per il bordo e giocare con l'indice Z per visualizzarlo in alto / in basso, oppure impilare i bordi orizzontalmente, imposta il minimo lungo come progresso, quindi per il resto dei progressi dovresti sottrarre le lunghezze dei progressi precedenti per ottenere lo stesso effetto.

In questo modo non ci sarebbero artefatti indotti dalla trasparenza e nessun OnRender () ... Intendiamoci, in WPF non ci dovrebbero essere motivi per confondere con OnRender questo e OnRender che, come era richiesto in WinForms con OnPaint. Basta impostare gli elementi tramite codice per ottenere l'aspetto desiderato e lasciare che WPF esegua il rendering;)

Posso immaginare un problema con questo controllo utente però. Dovresti fornire un feedback all'utente su quale colore appartiene a quale progresso. Ma questo probabilmente ti riporterebbe al punto di partenza, il che significa che è meglio / più semplice visualizzare più barre di avanzamento.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top