Sto disegnando un'intestazione per un controllo della timeline. Ecco come si presenta: 10000 + Elementi dell'interfaccia utente, bind o pareggio?
vado a 0,01 millisecondi per linea, quindi per una timeline 10 minuti Sto cercando di disegnare linee 60000 + 6000 etichette. Questo richiede un po ', ~ 10 secondi. Mi piacerebbe scaricare questo dal thread dell'interfaccia utente. Il mio codice è attualmente:
private void drawHeader()
{
Header.Children.Clear();
switch (viewLevel)
{
case ViewLevel.MilliSeconds100:
double hWidth = Header.Width;
this.drawHeaderLines(new TimeSpan(0, 0, 0, 0, 10), 100, 5, hWidth);
//Was looking into background worker to off load UI
//backgroundWorker = new BackgroundWorker();
//backgroundWorker.DoWork += delegate(object sender, DoWorkEventArgs args)
// {
// this.drawHeaderLines(new TimeSpan(0, 0, 0, 0, 10), 100, 5, hWidth);
// };
//backgroundWorker.RunWorkerAsync();
break;
}
}
private void drawHeaderLines(TimeSpan timeStep, int majorEveryXLine, int distanceBetweenLines, double headerWidth)
{
var currentTime = new TimeSpan(0, 0, 0, 0, 0);
const int everyXLine100 = 10;
double currentX = 0;
var currentLine = 0;
while (currentX < headerWidth)
{
var l = new Line
{
ToolTip = currentTime.ToString(@"hh\:mm\:ss\.fff"),
StrokeThickness = 1,
X1 = 0,
X2 = 0,
Y1 = 30,
Y2 = 25
};
if (((currentLine % majorEveryXLine) == 0) && currentLine != 0)
{
l.StrokeThickness = 2;
l.Y2 = 15;
var textBlock = new TextBlock
{
Text = l.ToolTip.ToString(),
FontSize = 8,
FontFamily = new FontFamily("Tahoma"),
Foreground = new SolidColorBrush(Color.FromRgb(255, 255, 255))
};
Canvas.SetLeft(textBlock, (currentX - 22));
Canvas.SetTop(textBlock, 0);
Header.Children.Add(textBlock);
}
if ((((currentLine % everyXLine100) == 0) && currentLine != 0)
&& (currentLine % majorEveryXLine) != 0)
{
l.Y2 = 20;
var textBlock = new TextBlock
{
Text = string.Format(".{0}", TimeSpan.Parse(l.ToolTip.ToString()).Milliseconds),
FontSize = 8,
FontFamily = new FontFamily("Tahoma"),
Foreground = new SolidColorBrush(Color.FromRgb(192, 192, 192))
};
Canvas.SetLeft(textBlock, (currentX - 8));
Canvas.SetTop(textBlock, 8);
Header.Children.Add(textBlock);
}
l.Stroke = new SolidColorBrush(Color.FromRgb(255, 255, 255));
Header.Children.Add(l);
Canvas.SetLeft(l, currentX);
currentX += distanceBetweenLines;
currentLine++;
currentTime += timeStep;
}
}
Avevo guardato in BackgroundWorker, tranne che non è possibile creare elementi dell'interfaccia utente su un thread non-UI.
È possibile eseguire drawHeaderLines in un thread non dell'interfaccia utente?
Posso utilizzare l'associazione dati per disegnare le linee? Questo potrebbe aiutare con la reattività dell'interfaccia utente?
Immagino di poter usare il databinding, ma lo stile è probabilmente al di là della mia attuale abilità WPF (proveniente da winforms e sto cercando di imparare cosa sono tutti questi oggetti di stile e li legano).
Qualcuno sarebbe in grado di fornire un punto di partenza per tentare questo fuori? O Google un tutorial che potrebbe iniziare?
Quale versione di .NET stai usando? Usando 4.5 questo può essere fatto per essere un po 'più semplice. – Servy
Sono in grado di utilizzare .NET 4.5 – jpiccolo
Ho modificato il titolo. Per favore vedi, "[Le domande dovrebbero includere" tag "nei loro titoli?] (Http://meta.stackexchange.com/questions/19190/)", dove il consenso è "no, non dovrebbero". –