Tja, dann hast Du jetzt mit VB.NET das selbe Problem, das C# Entwickler seit 2008 haben.
Du kannst dir da nur behelfen indem du ein eigenes Snippet schreibst.
Hm, wenn ich in C# ein privates Feld implementieren und in VS2010 dann auf das Namen des Feldes rechtsklicke, Refactor / Encapsulate Field auswähle kann ich daraus eine Property generieren. Schneller gehts aber mit dem Snippet "propfull" ;)
wie gfoidl schon sagte, kannst du Sandcastle verwenden um aus der xml-Datei eine CHM-Hilfe oder eine HTML-Hilfe zu erstellen. Da dass aber relativ kompliziert ist, empfiehlt sich die OpenSource Software "Sandcastle Help File Builder" zu verwenden.
Wahrscheinlich hast du irgendeine Tastenkombination gedrückt welche dein Layout geändert hat. Ist mir früher auch ab und zu passiert, aber seitdem ich alle anderen Layouts gelöscht habe und nur noch Deutsch in der Liste steht, passiert mir dass nicht mehr.
Weiss nicht ob es bessere Möglichkeiten gibt, aber so in etwa würde ich dass machen: Im MouseLeave-Event überprüft man, ob sich die Maus noch innerhalb des Controls befindet. Was du benötigen könntest wäre Top, Left, Height und Width des Controls. Außerdem die aktuelle Mausposition. Damit müsste sich ja feststellen können, ob sich die Maus noch innerhalb des Controls befindet. Wenn du dann sicher bist dass die Maus nicht innerhalb des Controls ist, führst du entsprechend deinen code aus.
Ich bin auch sehr zufrieden mit dem .NET Framework, sonst würde ich ja auch nicht damit arbeiten. Im Desktop Bereich würde ich auch nicht mehr mit einem anderen Framework bzw. einer anderen Sprache als C# arbeiten wollen .
Manche Sachen nerven mich zwar ein wenig, z.B. wünsche ich mir eine bessere Unterstützung von AOP - aber man kann halt nicht alles haben.
Und die Kommentare bei Heise lese ich mir auch nur noch selten durch - die schlagen sich doch eh bei jedem Thema nur die Köpfe ein - das tue ich mir nicht an. Aber der Hauptgrund warum ich die Kommentare bei Heise nicht lese ist eig. das Kommentarsystem welches einfach zum kotzen ist (aber das ist ein anderes Thema ... )
kann es sein dass du irgendwo einen Compilerfehler hast und du (früher?) die Meldung wo besagt "There were build errors. Would you like to continue and run the last successful build?" mit Yes und "Do not show this dialog again" beantwortet hast?
das liegt daran dass ich das ganze unter .NET4 ausprobiert habe und dort ist das DataGrid direkt mit integriert, deswegen klappt das auch so wie ich es gemacht habe.
Bei dir kennt er aber den Typ "DataGridColumnHeader" nicht, wie es dir die Fehlermeldung ja auch schon mitteilt.
Versuche mal folgendes: <Style TargetType="{x:Type my:DataGridColumnHeader}">
Du solltest nicht davon ausgehen, dass gleich jeder, der deine Software nutzt, gleich den illegalen Weg sucht, und eine gehackte Version verwendet.
[...]
Jede Software kann geknackt werden, es muss nur interessant genug sein, für einen Hacker.
Zitat von Jelly
[...] und dessen Quellcode für Hacker wohl noch nicht einmal von grossem Interesse [...]
Das Verhalten rührt daher, dass du den Index falsch berechnest und du e.Handled nicht auf "true" setzt.
Du machst jetzt gerade folgendes: Du holst dir den Index des nächsten "," zeichens und springst zu dem Index. Der Cursor ist dann genau ein Zeichen vor dem ",". Da du nun e.Handled nicht auf true setzt, geht der Cursor nochmal eins weiter und du denkst du hast alles richtig gemacht ;) Dem ist aber nicht so, wie du beim setzen des Cursors an die Position 0 feststellst.
Also addiere eins zum index hinzu und setzte e.Handled auf true:
weil das ein reines Compiler-Feature ist. Die Runtime und erst recht das Framework haben damit gar nichts zu tun.
Und deswegen sollte man auch auf die Verwendung von optionalen Paramter verzichten wenn man kein .NET 4 projekt bastelt - denn wenn jemand anders dieses Projekt kompilieren möchte und nicht mit VS2010 sondern nur mit VS2008 arbeitet, wird es zu Problemen kommen? (man sollte die optionalen Parameter ja eh mit Vorsicht genießen, wie oben schon beschrieben)
Hätte mal eine Frage bez. optionale parameter, ist zwar leider Offtopic aber ich wollte kein neues Thema erstellen.
Und zwar entwickle ich gerade mit VS2010 ein .NET 3.5 Projekt und habe dort eine Methoden mit optionale Parameter bestückt. Optionale Parameter gibt es ja erst seit .NET4, warum kann ich diese aber unter .NET 3.5 bereits verwenden ohne dass der Compiler meckert?
Und jetzt will ich auch noch was zum Thema beizutragen. Und zwar habe ich das Problem mal angeschaut und folgendes funktioniert:
public Test()
{
MethodeXY(Zusaetzliches:new string[] { "Test1", "Test1" });
}
public void MethodeXY(bool JaNein = true, params string[] Zusaetzliches) {
if (JaNein)
{
foreach (string item in Zusaetzliches)
{
Console.WriteLine(item);
}
}
}
Also verwenden kann man das auch mit optionale Parameter, man muss halt die Parameter in ein array packen.
also so wirklich bringt mir das auch nicht weiter. Ich könnte ElementName verwenden, wenn ich bereits ein Element hätte welchen diesen Style verwendet - dass habe ich aber nicht, denn diese werden erst später dynamisch erzeugt.
Also ich hab mir mal über den Wizard beim DataBinding folgendes zusammengeklickt:
Aber dass funktioniert nicht, denn es wird kein Text angezeigt. Dieses TargetType.Height kommt mir sowieso ein wenig komisch vor, habe dass mal in verschiedene andere Varianten geändert, aber ich kriege es einfach nicht hin ...
ich würde gerne, wie der Betreff schon aussagt eine Property an einen Wert, welches in einem Style mittels Setter gesetzt ist, in XAML binden. Um besser zu verstehen was ich machen möchte folgt ein Beispiel dazu. Ich habe folgenden Style definiert (in der App.xaml):
Du meintest vorhin "ich würde bei sowas dringend von UserControls abraten. ". Nun wollte ich fragen warum da abraten würdest. Ich hätte das und/oder/... Gatter nämlich als UserControl gemacht.
Also meiner Meinung nach wäre das viel einfacher, auch beim "erstellen" der Endfunktion. Da schaut man sich dann die Eingangs bzw Ausgangs Property (welche man natürlich selber implementieren muss) des Usercontrol an, und damit weiß ich welche Gatter miteinander verbunden sind.
Wenn man die ganzen Gatter nur mit Rechtecken zeichnet stelle ich mir dass doch recht kompliziert vor!
such mal in der Online Gallery (Tools -> Extension Manager) nach "Visual Studio Color Theme Editor". Damit kannst du das Aussehen von Visual Studio ebenfalls konfigurieren. Die Farben welche du da bearbeiten müsstest wären die ganzen EnvironmentBackground* Farben.
Hm also ich habe alle deine strings aus dem 1sten Beitrag ausprobiert und diese haben mir das richtige Ergebnis ausgespuckt. Nichtsdestotrotz entschuldige ich mich dafür ;)
Und hier die zwei Methoden, welche zum einen prüft ob ein Text eine balancierte Anzahl von regions hat, und zum anderen die Regions als Liste zurück gibt:
public bool HasBalancedRegions(string text)
{
int opened = Regex.Matches(text, RegexStartOfRegion, RegexOptions.Singleline | RegexOptions.Compiled | RegexOptions.Multiline).Count;
int closed = Regex.Matches(text, RegexEndOfRegion, RegexOptions.Singleline | RegexOptions.Compiled | RegexOptions.Multiline).Count;
return (opened - closed == 0);
}
public ObservableCollection<Region> GetRegionsFromText(string text, int startLineNumber = 1)
{
if (!HasBalancedRegions(text)) throw new UnbalancedRegionException();
ObservableCollection<Region> regions = new ObservableCollection<Region>();
Regex regex = new Regex(RegexSearchRegion, RegexOptions.Singleline | RegexOptions.Compiled | RegexOptions.Multiline);
MatchCollection matches = regex.Matches(text);
foreach (Match match in matches)
{
string[] newLineArr = new string[] { Environment.NewLine };
int newLinesBeforeMatch = text.Substring(0, match.Index).Split(newLineArr, StringSplitOptions.None).Length - 1;
int newLinesBetweenMatch = match.Value.Split(newLineArr, StringSplitOptions.None).Length - 1;
int startLine = startLineNumber + newLinesBeforeMatch;
int endLine = startLine + newLinesBetweenMatch;
Region region = new Region(match.Groups["name"].Value.Trim(), startLine, endLine);
region.Children = GetRegionsFromText(match.Groups["text"].Value, startLine + 1);
regions.Add(region);
}
return regions;
}
nun wird, wenn der User (bei meinem testcode) #endregion eingibt beim allersten durchlauf gleich eine Exception geworfen. Wenn er nun #region eingibt, wird später, beim holen der Children eine Exception geworfen --> alles funktioniert wie ich möchte :)
Wenn der User in einem neuen Dokument nur: #endregion\r\n#region eintippt, dann kommt zwar keine Meldung dass es unbalanced ist aber wenigstens freezed mein Programm nicht beim auswerten des Regex. Und gerade dieses freezen wollte ich beheben. Außerdem lässt sich der Code bei dem eingegebenen Text eh net kompilieren, also ist das halb so schlimm dass ich es nicht mitbekomme.
ohne Not würde ich Ausgleichsgruppen/balancing groups nicht verwenden.
Naja Not ist nicht wirklich da, ich könnte den Check auch einfach übergehen, dann würde die Ausgabe meiner TreeView (mit den regions) nicht sauber sein. Ich würde lieber eine Meldung anzeigen, welche besagt dass eine eine nicht ausgeglichene Anzahl von region's im Code vorhanden sind.
Wenn ich aber bedenke, dass das dauernde Prüfen auf solch einen Fall sich negativ auswirkt auf die Perfomance könnte ich auch auf diese Funktionalität verzichten. Denn solch ein Fall kommt doch relativ selten vor ... . Mich würde trotzdem interessieren ob sowas überhaupt möglich ist, denn ich habe es bisher nicht geschafft ;).
Zitat von der-schlingel
Hast du noch mehr vor in diesem Check oder prüfst du nur ob #region und #endregion gleich oft vorkommen?
Jein, also #region und #endregion sollte einerseits gleich oft vorkommen, aber es sollte auch sinnvoll verschachtelt sein, also wenn man z.B. folgenden Text hat:
#region
#endregion
#endregion
#region
dann kommen sie zwar gleich oft vor, aber nicht in einer korrekten logischen Reihenfolge.
€dit: Achja, ganz vergessen - es besteht Not, denn wenn ich irgendwo #region schreibe ohne passenden Endtag bleibt mein regex für die Suche nach regions hängen ... :( Werde mich jetzt erstmal mit folgenden Code abfinden:
public bool HasBalancedRegions(string text)
{
int opened = Regex.Matches(text, RegexStartOfRegion, RegexOptions.Singleline | RegexOptions.Compiled | RegexOptions.Multiline).Count;
int closed = Regex.Matches(text, RegexEndOfRegion, RegexOptions.Singleline | RegexOptions.Compiled | RegexOptions.Multiline).Count;
return (opened-closed == 0);
}