-
ACHTUNG - NEUES BLOG
Ab sofort steht unter http://devtyr.norberteder.com mein neues Blog zur Verfügung. Dieses Blog wird nicht weiter betreut, bleibt aber erhalten. Neue Eintr%auml;ge erfolgen nur mehr im neuen Blog. Kommentare werden ebenfalls nicht mehr behandelt. Wer weiterhin meinen Einträgen und Aktivitäten folgen möchte, möge bitte RSS-Feeds, Verlinkungen etc. an die neue Location anpassen.
|
ComboBox als DropDownList kann kein Text gesetzt werden
28.12.06 - .NET, WPF Beitrag von Norbert Eder| | Wer eine ComboBox verwendet und die Eigenschaft DropDownStyle auf DropDownList gesetzt hat, kann keinen Text mehr setzen. Dadurch entfällt auch die Möglichkeit, einen Default-Text zu setzen, wenn kein Item ausgewählt ist/wurde. Dem kann durch eine kurze und schnell Ableitung leicht Abhilfe geschafft werden.
public partial class ComboBoxEx : ComboBox
{
private Label _statusLabel = new Label();
private string _statusText = null;
public string StatusText
{
get { return this._statusText; }
set { this._statusText = value; }
}
public ComboBoxEx()
{
InitializeComponent();
Init();
this.Controls.Add(this._statusLabel);
this._statusLabel.Click += new EventHandler(_statusLabel_Click);
this.SizeChanged += new EventHandler(ComboBoxEx_SizeChanged);
this.SelectedIndexChanged += new EventHandler(ComboBoxEx_SelectedIndexChanged);
}
void _statusLabel_Click(object sender, EventArgs e)
{
this.DroppedDown = true;
}
void ComboBoxEx_SelectedIndexChanged(object sender, EventArgs e)
{
if (this.SelectedItem == null)
Init();
else
this._statusLabel.Visible = false;
}
void ComboBoxEx_SizeChanged(object sender, EventArgs e)
{
Init();
}
public void Init()
{
if (this.DropDownStyle == ComboBoxStyle.DropDownList)
{
this._statusLabel.Visible = true;
this._statusLabel.Location = new Point(1, 1);
this._statusLabel.Size = new Size(this.Width - 20, this.Height - 2 );
if (this._statusText != null)
{
this._statusLabel.Text = this._statusText;
this._statusLabel.Font = this.Font;
}
else
{
this._statusLabel.Text = "[Nothing selected]";
}
this._statusLabel.BringToFront();
}
else
{
this._statusLabel.Visible = false;
}
}
}
Es wird direkt von der ComboBox abgeleitet. Die neue Klasse erhält die Eigenschaft StatusText mit dessen Hilfe ein entsprechender Text gesetzt werden kann, der angezeigt wird, wenn kein Item ausgewählt ist.
| | | Kommentar hinzufügen
| 0 Trackbacks
| Permalink | Trackback-URL |
Meine GUI friert während der Ausführung ein, was tun?
04.12.06 - .NET, WPF Beitrag von Norbert Eder| | Ebenfalls eine oft gesehene Frage. Eine Aufgabe wird gerade ausgeführt und dabei friert die Oberfläche der Anwendung ein. Weder ein Fortschrittsbalken wird aktualisiert, noch ein Label, das den Fortschritt anzeigt. Ja selbst beim Verschieben der Form wird diese weiß und zeigt keine Informationen mehr an.
Der Hintergrund liegt einfach daran, dass durch eine ausgeführte Arbeit von dieser Form keine System-Message mehr angenommen wird bzw. diese nicht verarbeitet werden kann. Um dies zu vermeiden (und damit der Benutzer nicht irrtümlich annimmt, die Anwendung sei abgestürzt), bieten sich mehrere Lösungen an:
DoEvents
Durch ein Application.DoEvents() erhält die Anwendung die Möglichkeit, andere Events abzuhandeln und die Form neu zu zeichnen.
Threading
Aufwändige Aufgaben sollten in einem eigenen Thread ausgeführt werden. Dies kann über die Klassen des Namespaces System.Threading geschehen oder über einen BackgroundWorker. Hier ist jedoch zu beachten, dass von Threads nicht direkt auf die GUI-Elemente zugegriffen werden kann. Hierzu muss mit Invoke gearbeitet werden.
Wichtig: Locking
In manchen Fällen ist es wichtig, bestimmte Code-Teile mit einem lock (oder anderen entsprechenden Blockierungs-Maßnahmen) zu versehen. Dadurch kann der gleiche Code nur von einem einzigen Thread aufgerufen und ausgeführt werden. Dies kann mit einem DoEvents nicht ausreichend gelöst werden. In solchen Fällen sollte auf jeden Fall Threading verwendet werden.
| | | Kommentar hinzufügen
| 2 Trackbacks
| Permalink | Trackback-URL |
UserControls eines Namespaces finden
02.11.06 - .NET, Base Framework, WPF Beitrag von Norbert Eder| | Auf die Frage hin, wie man denn alle UserControls eines bestimmten Namespaces herausfinden kann, um diese dann dynamisch in ein Container-Control zu verfrachten, schrieb ich eine kleine Testanwendung die zeigt, wie man alle Klassen aus einem bestimmten Namespace bekommt. Zusätzlich wird die Information ausgegeben, ob es sich dabei um ein UserControl handelt oder nicht.
Download Beispiel-Projekt (VS 2005 Solution, 40KB)
Bei dieser Lösung ist jedoch anzumerken, dass sich ein Namespace auch über mehrere Assemblies hinweg erstrecken kann. Dies wurde nicht berücksichtigt. Das Beispiel sollte auch eher einen Denkanstoss geben, als eine fix fertige Solution liefern.
| | | Kommentar hinzufügen
| 0 Trackbacks
| Permalink | Trackback-URL |
Fachartikel: Windows Presentation Foundation - User Interfaces leicht gemacht?
24.10.06 - .NET, WPF Beitrag von Norbert Eder
Die grafische Länge eines Strings mit C# bestimmen
30.08.06 - .NET, Base Framework, WPF Beitrag von Norbert Eder| | In manchen Fällen (bei der Erstellung von UserControls oder der Verwendung von GDI+) ist es notwendig, die grafische Länge eines Strings zu kennen (also nicht nur die Anzahl der Zeichen). Nachfolgender Code zeigt, wie dies bewerkstelligt werden kann:
string test = "This is a test!";
Font font = new Font("Arial", 10.0F);
Graphics g = this.CreateGraphics();
SizeF sizeInfo = g.MeasureString(test, font);
this ist in diesem Fall eine Form, kann jedoch genausogut eine PictureBox etc. sein.
| | | Kommentar hinzufügen
| 0 Trackbacks
| Permalink | Trackback-URL |
Windows Presentation Foundation - Teil 2: XAML und Layouts
26.06.06 - .NET, WPF Beitrag von Norbert Eder
WPF: Rotation und Skalierung einfach gemacht
23.06.06 - .NET, WPF Beitrag von Norbert Eder| | Beschäftigt man sich näher mit der Materie Windows Presentation Foundation, sieht man schon an sehr einfachen Beispielen, dass die Möglichkeiten schon sehr mächtig sind. Beispielhaft zeige ich an dieser Stelle, wie einfach ein Button skaliert und gedreht werden kann.
Dazu wird im Beispiel ein simpler Button erstellt und plaziert. Über Schieberegeler ist es möglich, die Values für die Rotation bzw. des Zoomfaktors zu setzen. Dies sieht dann folgendermaßen aus:
Um nun die Funktionalität zu implementieren ist nichts weiter zu machen, als die entsprechenden EventHandler zu setzen:
Zoomfaktor
public void sliderZoom_ValueChanged(object sender, RoutedEventArgs e)
{
ScaleTransform st = new ScaleTransform(sliderZoom.Value, sliderZoom.Value);
this.btnTest.LayoutTransform = st;
}
Rotationsfaktor
public void sliderRotate_ValueChanged(object sender, RoutedEventArgs e)
{
RotateTransform rt = new RotateTransform(sliderRotate.Value);
this.btnTest.RenderTransform = rt;
}
Das Ergebnis sieht dann wie folgt aus:
Dies kann jetzt nicht nur auf einen Button angewandt werden, sondern auf die gesamte Oberfläche, oder auch nur einzelne Bereiche. Der dahinterliegenden XAML-Code etc. ist im gesamten Projekt enthalten, welches zum Download bereit steht.
Download WPF Rotation Test Beispiel
| | | Kommentar hinzufügen
| 0 Trackbacks
| Permalink | Trackback-URL |
Windows Presentation Foundation - Teil 1: Einführung
21.06.06 - .NET, WPF Beitrag von Norbert Eder
Neue Kategorie WPF
17.05.06 - .NET, WPF Beitrag von Norbert Eder| | Im Moment beschäftige ich mich mit der Windows Presentation Foundation (ehemals Avalon). Da hier sicherlich die einen oder anderen Tipps bzw. Beispiele anfallen werden, habe ich mich entschlossen, zu diesem Thema eine eigene Kategorie einzurichten.
Auf dass sie sich mit sinnvollen Inhalten füllen möge ;-)
| | | Kommentar hinzufügen
| 0 Trackbacks
| Permalink | Trackback-URL |
C# Beginner: UserControl DoubleTrackBar Beispiel
04.03.06 - .NET, WPF Beitrag von Norbert Eder| | Deisem Eintrag liegt ein Beispiel bei, welches zeigt, wie ein einfaches DoubleTrackBar-Control erstellt werden kann.
Mit Hilfe dieses Controls können mit zwei Schieberegler ein Minimum-Wert und ein Maximum-Wert eingestellt werden. Eigentlich ein recht simples Problem, jedoch nicht für C# Programmierer, die in Themen wie GDI+, UserControls wenig Erfahrung haben.
Der folgende Screenshot zeigt das Aussehen des UserControls in einer kleinen Testanwendung:
Zusätzliche Funktionalitäten sollten sich recht einfach einfügen lassen.
Anforderungen: .NET 2.0 für die Solution. Sourcecode auch unter .NET 1.1 nutzbar
Download
| | | Kommentar hinzufügen
| 0 Trackbacks
| Permalink | Trackback-URL | Zurück Weiter
|
|
|
|
|
|
|