Wenn man die gesamte Grafik selber zeichnet, dann sollte man ein Panel verwenden. Aber da du ein Bild laden und anzeigen möchtest, kannst du hierfür auch eine PictureBox verwenden und darüber zeichnen.
Alternativ kannst du aber auch das Bild (oder einen Auschnitt davon) mittels einer der Graphics.DrawImage-Methoden selber zeichnen.
Zitat von AceTecNic
Ein weiterer Dozent hat das ganze ziemlich Interessant angefangen: In der Projektmappe hat er gesamt drei Projekte erstellt. MyApp_.UI && MyApp_.Logik && MyApp_.Daten
Anschließend werden die Abhängigkeiten gesetzt in VS und dann legt er los. Das würde ich, als Unwissender, als MVVM einschätzen?
Das hat nichts direkt mit MVVM zu tun (wenn dann wäre der ViewModel-Code in "MyApp_UI"), sondern entspricht der [Artikel] Drei-Schichten-Architektur.
Zitat von Timm2023
ich habe eine ListBox die ich an ein Dataset binde, dass zuvor Daten aus einer Datenbank (MS SQL Server) abgerufen hat.
Direkt an ein DataSet wirst du wohl nicht gebunden haben, sondern an eine enthaltene DataTable und hierbei ist dann der eingetragene Wert bei DataColumn.ColumnName entscheidend.
Dafür kannst du z.B. den Process Explorer verwenden (der rechte Toolbar-Button "Find Window's Process").
Die Textbox sollte beim Erhalten des Fokus nicht automatisch selektiert sein, sondern nur wenn sie es vorher schon war (dafür gibt es ja die beiden Eigenschaften SelectionStart und SelectionLength).
Wenn jedoch der Text programmtechnisch geändert wird, so wird intern ein Flag gesetzt, welches beim nächsten Fokussieren automatisch den gesamten Text selektiert, s. Sourcen zu TextBox.Text (Erklärung s. Kommentar zu _selectionSet).
Nur die interne Methode SelectInternal setzt dieses Flag auf true, welche u.a. von Select(int start, int length) aufgerufen wird,
Du müßtest dir also die aktuelle Cursor-Position SelectionStart vor der Zuweisung von Text merken und nachher Select(pos, 0) aufrufen.
PS: Ich hoffe dir ist klar, daß die Cursor-Position durch das Ändern des Textes mittels deiner verboten-Methode sich nicht an der aktuellen Textstelle orientiert, sondern einfach nur ein Index ist, d.h. wenn du z.B. einige Buchstaben am Anfang löscht, und der Cursor dahinter stand, sich dann der Cursor nachher ein paar Positionen nach rechts verschiebt: deleted|constant Text-> constan|t Text.
Wenn du das exakt lösen möchtest, dann müßte deine verboten-Methode z.B. einen Parameter ref int pos erhalten, der dann intern beim Löschen mitgeändert wird (beachte dabei verschiedene Fälle).
Hallo StayCalm,
schau dir einfach mal dieses Beispiel an: Erzeugen und Verwendung eines UserControls
Anstatt mehrere dieser UserControls einzeln zu instanziieren, kannst du diese natürlich auch in einem Container (z.B. ItemsControl) darstellen, damit du vom MVVM-Code her einfacher auf diese zugreifen kannst (mittels Index anstatt individuell).
lutzeslife meinte beim Kontextmenü die Properties.
Wenn du die Resource nicht direkt per Code ansprechen kannst, dann schau mal in die generierte Resources.Designer.cs. Dort sollte es eigentlich die erzeugten Eigenschaften geben, wie z.B. bei einem Bild
internal static System.Drawing.Bitmap X {
get {
object obj = ResourceManager.GetObject("X", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
Dein Code macht ja auch nicht anderes (nur eben explizit für eine bestimmte Resource ausprogrammiert).
PS: Warum hast du denn 4x Refresh in deinem Kontextmenü?
Evtl. mit einem Attached Property, wie in der Antwort von Set Focus for TextBox in Style Trigger?
Daß das Menü wieder verschwindet, liegt wohl daran, daß ein Menü wieder automatisch geschlossen wird, wenn der Eingabefokus (per Mausklick oder Tastatur) auf ein anderes Control geändert wird.
Und die falsche Positionierung sehe ich auch als Bug an.
In Verbindung mit
mc:Ignorable="d"
(sollte schon im <Window ... >XAML-Code stehen, ansonsten dort hinzufügen)
probiere mal
<MenuItem Header="File" d:IsSubmenuOpen="true">
so daß es nur zur Design-Time ausgeführt wird.
Edit:
In Verwenden von Entwurfszeitdaten mit dem XAML-Designer in Visual Studio gibt es weitere Infos dazu.