private void los()
{
while (mylist.Count > 0)
{
String aktuell;
aktuell = mylist.ElementAt(0);
if (aktuell == "DG_runter")
{
dg_runter();
if (mylist.Count > 0)
{
mylist.RemoveAt(0);
};
};
if (aktuell == "2OG_runter")
{
og2_runter();
if (mylist.Count > 0)
{
mylist.RemoveAt(0);
};
};
if (aktuell == "2OG_hoch")
{
og2_hoch();
if (mylist.Count > 0)
{
mylist.RemoveAt(0);
};
};
if (aktuell == "1OG_runter")
{
og1_runter();
if (mylist.Count > 0)
{
mylist.RemoveAt(0);
};
};
if (aktuell == "1OG_hoch")
{
og1_hoch();
if (mylist.Count > 0)
{
mylist.RemoveAt(0);
};
};
if (aktuell == "EG_hoch")
{
eg_hoch();
if (mylist.Count > 0)
{
mylist.RemoveAt(0);
};
};
}
}
Ein echter Kandidat für den Coding Style Horror Award.
1. Viel zu viel doppelter Code
2. Unnötige ";"
3. Alles Deutsch
[4. C# Naming Convention nicht einhalten]
[5. Unnötige Klammern]
[6. Unnötige Count abfragen]
(4, 5 und 6 würden durch Punkt 1 aufgeräumt, daher geklammert)
@David W: Du hast vollkommen Recht mit deinen Punkten Schell, Fehlerfrei und Verlustfrei. Leider war meine Idee und in meinem Kopf die schnellste möglichkeit eine Zeile in eine Datei zu schreiben.
Leider hast du kein Beispiel genannt wie man es besser machen könnte.
// Nach Formatierung der Message, ruf diese Methode zum Schreiben auf.
private void Write(string logFile, string message)
{
using (var writer = new StreamWriter(logFile, true, Encoding.UTF-8)
writer.WriteLine(message);
}
Zusammen mit dem Kommentar von inflames2k
Zitat
Wenn du es schlau anstellst hast du für jeden Tag ein neues Log
hast du auch kein Performance Problem.
Der Vorteil: Es ist einfach. Es ist leicht lesbar. Es kann nur zu Datenverlust kommen wenn die Datei nicht geschrieben werden kann oder es genau in der nanosekunde abbricht. Aber auch dann fehlt immer nur eine Zeile.
Falls du doch bedenken hast kannst du die Datei auch mit Autoflush offen halten:
private StreamWriter _logWriter;
private void OpenLog(string logFile)
{
_logWriter = new StreamWriter(logFile, true, Encoding.UTF8);
_logWriter.AutoFlush = true;
}
// Nach Formatierung der Message, ruf diese Methode zum Schreiben auf.
private void Write(string message)
{
_logWriter.WriteLine(message);
}
Logging in eine XML Datei halte generell ich für keine gute Idee.
Denn sobald der Prozess durch ein Fehler stirbt kann es sehr schnell passieren das die XML ungültig wird, dann muss man erstmal die XML wieder reparieren. Es kann sogar sein das Datenverlust eintritt da noch nicht alles in die XML geschrieben wurde.
Das ist nicht die Idee eines Loggings.
Logging muss Schnell, Fehlerfrei und Verlustfrei sein.
Es gibt massig Tutorials wie man ein Gmail Konto hinzufügt .. aber bei mir werden die Mails nie geladen.
Ich kenne weder Office 365 noch habe ich solche Tutorials gesehen, aber mal ganz Blöd gefragt: Hast du in deinen GoogleMail Settings auch IMAP (oder POP) aktiviert? Standardmäßig ist es nämlich aus.
Du kannst im getter Methoden ausführen lassen. Unabhängig davon ist dein Code da nicht sehr schön an zu sehen -.- Man sieht auf einen Blick viele Fehler.
Du kannst ein Control mit IsHitTestVisible für die Maus unsichtbar machen, dann klickst du durch.
Das Propertie kannst du einfach Binden und dann immer zwischen Klickbar und Nicht-Klickbar umschalten :D
Was auch geht wäre ein Custom Attached Behavior, das häng an einem Beliebigen FrameworkElement und fängt dessen LeftMouseButtonDown, sobald das kommt klettert es den Visual Tree hoch und selektiert den ListViewItem Container :)
Würde es nicht gehen eine neue Leere Seite ohne Formatierung zu öffnen mit nur dem Quelltext? Ne einfache txt, da kann man dann alles Markieren und sich kopieren (CTRL+A) ohne das man mit dem drumherum durcheinander gerät.
Aber andere Frage dazu, ist es gewünscht das man sich Fertige Lösungen zusammen kopiert? Der Lerneffekt ist doch größer wenn man es selber eingibt
So läuft.
Hustbear Du hattes recht.
Die DB muss in der Menagement Konsole erstellt werden, dann braucht man auch "AttachDbFilename" nicht mehr.
Ich habe aus Unwissen die DB mit VS erstellt.
Danke.
Hier:
Zitat von "c#nappi"
So läuft.
FZelleDu hattes recht.
Die DB muss in der Management Konsole erstellt werden, dann braucht man auch "AttachDbFilename" nicht mehr.
Ich habe aus Unwissen die DB mit VS erstellt.
Mach das lieber über den Triggers, so lange du kein SL Programmierst bist du auf diese krüppeligen VisualStates nicht angewiesen.
- In Visual States kann man nur vorhandenes editieren statt komplett neu zu schreiben [Hintergründe mit unterschiedlichen Verläufen ist sehr fummelig],
- Man ist auf Storyboards begrenzt,
- Visual States sind deutlich länger
- Triggers sind einfacher zu handhaben
Hier das was du suchst, ohne das du das MouseLeft o.ä. noch implementieren musst.
das kann man per Gruppenrichtlinie abschalten, dann hat man per Default wieder den alten Desktop.
Was schon sehr Sinnvoll ist auf Nontouch Desktop PCs.
Wenn ich an das Video denke, wo er diese Tiles mit der Maus benutzte, wirkte das doch sehr fummelig ^^.
Find ich ein komischen Trend alles immer größer zu machen. Wenn man mit der Maus arbeitet braucht man doch gar nicht so ein riesen Button (Linux ist da aber auch nicht besser, in Ubuntu muss man auch erstmal alles kleiner machen [Mint geht]).
Du kannst innerhalb des Template das TabPanel verschieben. Ein template Beispiel siehst du hier DW.WPFToolkit
Was du aber vor hast ist das Splitten des ItemsHost. Das geht nicht. Du kannst maximal ein Custom Control machen welches eine ItemsSource2 oder so bereit stellt und das dann im Template zusätzlich positionieren.
“Excluded Products” are software products or components, or web-based or hosted services that perform primarily the same general functions as the Microsoft Office Word, Excel, PowerPoint, Outlook and Access software applications, and that are created or marketed as a replacement for any or all of those Microsoft applications.
95 Schlecht
98 Gut
ME Schlecht
XP Gut
Vista Schlecht
7 Gut
8 Schlecht
9 Gut
Wozu dann über 8 Diskutieren wo die meisten vermutlich auf 7 bleiben und von dort direkt auf 9 Springen ^^
Ich finde man sollte jetzt erstmal in ruhe auf die ersten Betas warten, mit MSDN Subscription usw bekommt man es früh genug dass man dann sein vorurteil bilden kann.
Bei den anderen Controls die eingefügt werden ist es ja wie angegeben immer 5
das zeige ich mal als "i"
5. <000><111><0><i><00><111><000>
Wenn man nach jeder Formatierung 2 hinzu fügt als "MoveIndicator" (><) und für jedes "Inline Element" 5 (><x><) dann ist man auf der richtigen Seite.
Die Art der Formatierung macht kein unterschied.
Doch nicht so einfach wie ich dachte.
Sobald ich eine Formatierung hinzufüge verschiebt sich die Position immer willkürlich.
Ich habe dies hier:
foreach (var formatting in formattings)
{
var range = new TextRange(flowDocument.ContentStart, flowDocument.ContentEnd);
var begin = range.Start.GetPositionAtOffset(GetPosition(formatting.Begin, elements), LogicalDirection.Forward);
var end = begin.GetPositionAtOffset(formatting.End - formatting.Begin);
var formatRange = new TextRange(begin, end);
if (formatting.IsBold)
formatRange.ApplyPropertyValue(TextBlock.FontWeightProperty, FontWeights.Bold);
else
formatRange.ApplyPropertyValue(TextBlock.FontWeightProperty, FontWeights.Normal);
}
Wenn ich diesen Text habe:
000111000111000
und ich will
000 nicht formatiert
111 Fett formatiert
Ist der verlauf so:
000111000111000
000111000111000
000111000111000
000111000111000
Wenn ich die Bolds aber immer nur einmal setzen lasse, dann passt es.
000111000111000
000111000111000
mein Ziel ist aber
000111000111000
Scheinbar ist es immer wenn eine Formatierung hinzugefügt wurde die nicht die erste ist, dann muss ich überall +2 machen. Ich weiß aber nun nicht ob das immer passt - auch mit den anderen formaten wie Italic, andere Schriftgröße usw...
Scheinbar muss ich für jedes Element was vor der Position war 5 dazu addieren.
var range = new TextRange(flowDocument.ContentStart, flowDocument.ContentEnd);
foreach (var formatting in formattings)
{
var begin = range.Start.GetPositionAtOffset(GetPosition(formatting.Begin, elements));
var end = range.Start.GetPositionAtOffset(GetPosition(formatting.End, elements));
var formatRange = new TextRange(begin, end);
formatRange.ApplyPropertyValue(TextElement.FontWeightProperty, FontWeights.Bold);
}
}
private int GetPosition(int position, List<InlineElement> elements)
{
int count = elements.Where(e => e.Pos ≤ position).Count() * 5;
return position + count;
}
Ich habe zZt das Problem das ich in einer RichTextBox UI Elemente an einer vorgegebenen Stelle einfügen muss. Das funktionierte soweit.
Ich Zeige erstmal wie.
(Ich habe es zum Testen mal billig nach gebaut)
Gegeben sind diese Objekte:
public class InlineElement
{
public int Pos { get; set; }
public string Text { get; set; }
}
public class Formatting
{
public int Begin { get; set; }
public int End { get; set; }
public bool IsBold { get; set; }
}
Test Daten:
private Run CreateTextContent(string text, int from, int to)
{
return new Run(text.Substring(from, to - from));
}
private string GetText()
{
return "00123456000000000000";
}
private List<InlineElement> GetElements()
{
var elements = new List<InlineElement>();
elements.Add(new InlineElement
{
Pos = 5,
Text = "variable"
});
return elements;
}
private List<Formatting> GetFormattings()
{
var formattings = new List<Formatting>();
formattings.Add(new Formatting
{
Begin = 2,
End = 8,
IsBold = true
});
return formattings;
}
Aufrag war als erstes nur diese "InlineElemente" als Buttons in ein Text zu packen:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
var text = GetText();
var elements = GetElements();
var paragraph = new Paragraph();
int pos = 0;
for (int i = 0; i < elements.Count; ++i)
{
var element = elements[i];
var run = CreateTextContent(text, pos, element.Pos);
paragraph.Inlines.Add(run);
paragraph.Inlines.Add(new Button
{
Content = element.Text
});
pos = element.Pos;
}
if (pos < text.Length)
{
var run = CreateTextContent(text, pos, text.Length);
paragraph.Inlines.Add(run);
}
flowDocument.Blocks.Add(paragraph);
}
Wie man an dem ersten Bild erkennt war das soweit kein Problem. (1)
Ich habe es so gelöst indem ich den Text einfach gesplittet in Run Objekte gepackt habe.
Nun soll der Text auch noch formatiert dargestellt werden, wo und wie ist auch über die Struktur vorgeben.
Ich war beim Recherchieren auf TextRange und TextPointer gestoßen, aber da gibts nun ein Problem. Und war durch das Splitten ist die Selektion am ende verschoben (2)
(Die Testdaten sagen das die Zahlen 1-6 Bold sein sollen, wenn ich den Text nicht Splitte passt es genau)
private void Window_Loaded(object sender, RoutedEventArgs e)
{
var text = GetText();
var elements = GetElements();
var formattings = GetFormattings();
var paragraph = new Paragraph();
int pos = 0;
for (int i = 0; i < elements.Count; ++i)
{
var element = elements[i];
var run = CreateTextContent(text, pos, element.Pos);
paragraph.Inlines.Add(run);
//paragraph.Inlines.Add(new Button
//{
// Content = element.Text
//});
pos = element.Pos;
}
if (pos < text.Length)
{
var run = CreateTextContent(text, pos, text.Length);
paragraph.Inlines.Add(run);
}
flowDocument.Blocks.Add(paragraph);
var range = new TextRange(flowDocument.ContentStart, flowDocument.ContentEnd);
foreach (var formatting in formattings)
{
var begin = range.Start.GetPositionAtOffset(formatting.Begin);
var end = range.Start.GetPositionAtOffset(formatting.End);
var formatRange = new TextRange(begin, end);
formatRange.ApplyPropertyValue(TextElement.FontWeightProperty, FontWeights.Bold);
}
}
Wenn ich nun das Element einfügen lass ist die Selektion noch mehr verschoben. (3)
Jemand ne Idee wie ich das Problem korrekt Löse?
Die Anzahl der Elemente, der Text und die Anzahl sowie art der Formatierung ist mir im Vorfeld unbekannt.
"SetSource" hab ich zwar selber noch nie gesehen, aber kann es sein das du auch bei dieser BitmapImage klasse das BeginInit und EndInit aufrufen musst?
Erstens das, und zweitens: Versuchs doch mal.
Es ist zwar korrekt das man den Code lesen kann, aber lass ihn doch mal abspeichern und Versuch es baubar zu bekommen. Behebungen in den Quelltexten. Erstellen eines Projektes und Solutions. Zusammensuchen von allen verwendeten 3rdParty libraries. Das ist alles nicht so einfach wie es sich anhört.
Die einzigste gefahr ist das wissen innerhalb einer Methode, also das man das abschauen kann. Mit guten OOP sind die Methoden aber sehr kurz sodass man ohne IDE unterstützung schwerer zurecht findet. Obfuscatoren gibts ja auch noch.
Hast du meine Antworten gelesen? Eine Row und Column ist nie unsichtbar, sie ist immer da, nur wenn du keine größe vorgibst und nichts in dem Bereich hast, dann ist die größe eben 0 und du siehst nichts.
Ich klink mich aus, wird mir grad zu blöd hier die WPF Basics vor zu kauen...
Ich rate mal ins Blaue: Du willst die Maßeinheit mit vergößern sodass dies sich nicht ändert?
Wo ist in dein Xaml denn dein Transform Objekt?
Wenn du es nur Optisch vergößern willst ohne das sich das Objekt selber vergrößert musst du mit der RenderTransform arbeiten, nicht mit dem LayoutTransform.
Du kannst zwei Template definieren, einmal ein Template für den geschlossen zustand wo es normal angezeigt wird.
Und dann ein Template für den geöffneten zustand, da packst du dir noch ein Dummy Control rein welches eine voegegebene Breite nimmt (Festgelegt mittels eines IValueConverters).
Zwischen die beiden Template wählst du dann mitteles eines DataTemplateSelectors.
Ein Beispiel dieses Selectors findest du in den Beitrag von mir hier: ComboBox - nicht alles aus DropDown übernehmen (ungefähr in der Mitte).
//Dazu
Falls du weiterhin ein echten Baum haben willst ist solch ein Control wie ich dir schon Zeigte das richtige für dich, da sind die Items in einem Baum angezeigt aber das ausgewählte Item nicht mehr, da kannste das Template auch selber bestimmen.