Ich zeichne eine Kopfzeile für eine Zeitleistensteuerung. Es sieht wie folgt aus: 10000 + UI-Elemente, binden oder zeichnen?
ich pro Zeile auf 0,01 Millisekunden gehen, also für 10 Minuten Timeline ich bei Zeichnung 60000 Linien + 6000 Etiketten suchen. Das dauert eine Weile, ~ 10 Sekunden. Ich möchte dies vom UI-Thread herunterladen. Mein Code ist zur Zeit:
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;
}
}
ich in Backgroundausgesehen hatte, außer dass Sie nicht UI-Elemente auf einem Nicht-UI-Thread erstellen können.
Ist es überhaupt möglich, drawHeaderLines in einem Nicht-UI-Thread zu tun?
Kann ich Datenbindung zum Zeichnen der Linien verwenden? Würde dies bei der Reaktionsfähigkeit der Benutzeroberfläche helfen?
Ich könnte mir vorstellen, dass ich Datenbindung verwenden kann, aber das Styling ist wahrscheinlich jenseits meiner aktuellen WPF-Fähigkeit (von Winforms kommend und versuche zu erfahren, was all diese Stilobjekte sind und sie binden).
Wäre jemand in der Lage, einen Ausgangspunkt für die Verlockung dieses liefern? Oder Google ein Tutorial, mit dem ich anfangen könnte?
Welche Version von .NET verwenden Sie? Mit 4.5 kann das etwas einfacher gestaltet werden. – Servy
Ich kann .NET 4.5 verwenden – jpiccolo
Ich habe Ihren Titel bearbeitet. Bitte lesen Sie "[Sollten die Fragen" Tags "in ihren Titeln enthalten?] (Http://meta.stackexchange.com/questions/19190/)", wobei der Konsens "nein, sie sollten nicht" lautet. –