Sonntag, 22. Mai 2011, 17:41 von Dennis Duda
Im letzten Artikel habe ich bereits die Eigenschaften ProgressState und ProgressValue vorgestellt. In diesem Artikel werden die anderen TaskbarItemInfo-Eigenschaften behandelt.
Description

Die Eigenschaft Description bestimmt den Text im Tooltip, wenn das Thumbnail eine längere Zeit offen ist. Sie nimmt einen String an.
Overlay

- Overlay-Bild
Ein Overlay ist ein kleines Icon, welches über das Programmicon in der Superbar gelegt wird, um beispielsweise einen bestimmten Status darzustellen. Die Eigenschaft erwartet ein Image.
ThumbnailClipMargin

ThumbnailClipMargin (Quelle: MSDN Library)
Die Eigenschaft ThumbnailClipMargin bestimmt den Ausschnitt des angezeigten Thumbnails und erwartet einen Thickness-Wert, mit dem der Ausschnitt eingegrenzt wird. Das Bild aus der MSDN Library beschreibt das Ganze sehr gut.
ThumbButtonInfos
ThumbButtons sind kleine Buttons, die unter dem Thumbnail angezeigt werden, um bestimmte Aktionen schnell tätigen zu können. ThumbButtonInfos erwartet eine ThumbButtonInfoCollection, die die ThumbButtons beherbergt. Eine genaue Erklärung sowie ein Beispiel finden Sie hier in der MSDN Library.
Geschrieben in Tipps und Tricks, Tutorials, WPF, WPF | Tags: .NET • .NET 4 • Windows 7 • WPF
Shortlink | Trackbacks/Pingbacks (0) | Keine Kommentare »
Sonntag, 22. Mai 2011, 15:27 von Dennis Duda

- Windows 7 TaskbarItem mit Statusleiste
Wahrscheinlich haben Sie – sofern Sie Windows 7 benutzen – schon einmal diesen Status- beziehungsweise Ladebalken in der Superbar gesehen. Seit dem .NET Framework 4 gibt es einen entsprechenden Namespace für die Superbar für WPF: System.Windows.Shell.
In diesem findet sich unter Anderem die Klasse TaskbarItemInfo, welche für ein TaskbarItem, also im Normalfall ein Fenster, den Ladebalken-Status und dessen Fortschritt, so genannte ThubnailButtons (Buttons unter dem Thumbnail), den Thumbnailausschnitt, ein Overlay für das Programm-Icon und die Beschreibung im Tooltip des Thumbnails zuständig ist.
In diesem Artikel geht es um die Ladebalkeneigenschaften. Damit Sie auf diese zugreifen zu können, benötigen Sie eine TaskbarItemInfo-Instanz, welche der gleichnamigen Eigenschaft eines Windows zugeordnet ist. Dies lässt sich am leichtesten in XAML realisieren:
XAML
<Window [...]>
<Window.TaskbarItemInfo>
<TaskbarItemInfo/>
</Window.TaskbarItemInfo>
</Window>
Alternativ können Sie dasselbe natürlich auch im Code-Behind machen:
VB.NET
Me.TaskbarItemInfo = New Shell.TaskbarItemInfo()
C#
this.TaskbarItemInfo = new Shell.TaskbarItemInfo();
Nun können Sie auf die Eigenschaften ProgressValue und ProgressState des TaskbarItemInfo-Objekts zugreifen, mit denen Sie den Fortschritt und den Status des Ladebalkens beeinflussen können. Die Eigenschaft ProgressState erwartet einen Wert aus der Enumeration System.Windows.Shell.TaskbarItemProgressState. Die folgenden Werte gibt es:

Ladebalken mit ProgressState = Indeterminate
- None – Es wird kein Ladebalken angezeigt.
- Normal – Es wird ein normaler, grüner Ladebalken angezeigt.
- Paused – Es wird ein gelber Ladebalken angezeigt. Dieser ist für Pausen im Ladevorgang gedacht.
- Error – Es wird ein roter Ladebalken angezeigt. Dieser ist für Fehler gedacht.
- Indeterminate – Es wird ein durchlaufender, grüner Ladebalken angezeift. Dieser ist für Aktionen gedacht, bei denen der aktuelle Fortschritt nicht angezeigt werden kann.
ProgressValue ist ein Double-Wert, der den Prozentsatz als Dezimalzahl angibt, also eine Zahl zwischen 0 und 1. Werte über 1 gelten als 1; Werte unter 0 gelten als 0. Der Wert Double.NaN gilt ebenfalls als 0.
Geschrieben in Tipps und Tricks, Tutorials, WPF, WPF | Tags: .NET • .NET 4 • Superbar • Taskbar • Windows 7 • WPF
Shortlink | Trackbacks/Pingbacks (1) | 1 Kommentar »
Mittwoch, 18. Mai 2011, 20:22 von Dennis Duda
Ich wollte einfach nur eine Datenbank aktualisieren, nachdem eine Zeile im DataGrid bearbeitet wurde. Ich habe mit die Events angeguckt und RowEditEnding gefunden, aber e.Row.Item enthielt noch das “alte” Item. Nach einer kurzen Suche in der MSDN Library habe ich bemerkt, dass das Silverlight-DataGrid ein RowEditEnded-Event hat, doch dem WPF-DataGrid fehlt dieses. Dasselbe trifft auf CellEditEnded zu.
Gibt es einen anderen Weg an die “neue” Zeile zu kommen, also nachdem die Zeile bearbeitet wurde?
Bei Silverlight benutzt man einfach das RowEditEnded-Event. Um das Parallele auch in WPF hinzubekommen, muss man ein wenig in die Trickkiste greifen, indem man per Dispatcher.Invoke eine Aktion ausführen lässt, die durch die niedrige Priorität erst nach dem RowEditEnding-Event ausgeführt wird. In Codeform sieht das ganze beispielsweise so aus:
VB.NET
Private Sub dg_RowEditEnding(sender As Object, e As DataGridRowEditEndingEventArgs)
Dispatcher.BeginInvoke(New Action(Function() MessageBox.Show(e.Row.Item.ToString())), System.Windows.Threading.DispatcherPriority.Background)
End Sub
C#
private void dg_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e)
{
Dispatcher.BeginInvoke(new Action(() => MessageBox.Show(e.Row.Item.ToString())), System.Windows.Threading.DispatcherPriority.Background);
}
Schon hat man ein RowEditEnded-Event-Fake.
Geschrieben in Tipps und Tricks, WPF | Tags: DataGrid • Silverlight • WPF
Shortlink | Trackbacks/Pingbacks (0) | Keine Kommentare »
Freitag, 6. Mai 2011, 16:36 von Dennis Duda
Frage:
Ich schließe ein WPF-Fenster mit Me.Close(), doch es werden auch alle anderen Fenster geschlossen und das Programm beendet! Was mache ich falsch?
Antwort:
Da ist wohl der falsche Modus für das Herunterfahren eingetragen. Standardmäßig ist in den Projekteinstellungen unter Modus für das Herunterfahren “Beim Schließen des letzten Fensters” eingetragen. Bei Ihnen ist das nicht so. Um dies zu ändern, folgen Sie der Anweisung:
Doppelklicken Sie auf den Eintrag My Project ihnes Projektes im Projektmappen-Explorer. In der Registerkarte Anwendung finden Sie unten die Eigenschaften des Windows-Anwendungsframeworks. Dort stellen Sie den Modus für das Herunterfahren wieder zurück auf “Beim Schließen des letzten Fensters”. Schon sollte das Problem gelöst sein.
Geschrieben in Tipps und Tricks, WPF | Tags: Fenster • WPF
Shortlink | Trackbacks/Pingbacks (0) | Keine Kommentare »
Freitag, 6. Mai 2011, 15:57 von Dennis Duda
In Windows Forms ist es ziemlich kompliziert ein Fenster zu verschieben, welches keinen Rand hat. Das geht beispielsweise so:
VB.NET
Private ptMouseDownLocation As Point
Private Sub Form1_MouseDown(...) Handles Me.MouseDown
If e.Button = Windows.Forms.MouseButtons.Left Then
ptMouseDownLocation = e.Location
End If
End Sub
Private Sub Form1_MouseMove(...) Handles Me.MouseMove
If e.Button = Windows.Forms.MouseButtons.Left Then
Me.Location = e.Location - CType(ptMouseDownLocation, Size) + CType(Me.Location, Size)
End If
End Sub
C#
private Point ptMouseDownLocation;
private void Form1_MouseDown()
{
if (e.Button == System.Windows.Forms.MouseButtons.Left) {
ptMouseDownLocation = e.Location;
}
}
private void Form1_MouseMove()
{
if (e.Button == System.Windows.Forms.MouseButtons.Left) {
this.Location = e.Location - (Size)ptMouseDownLocation + (Size)this.Location;
}
}
Ziemlich viel Code für solch eine Aufgabe, nicht?
Zum Glück geht das in WPF viel einfacher. In das MouseLeftButtonDown-Ereignis des Fensters (oder eines Steuerelements) kommt diese eine kurze Zeile Code:
Me.DragMove()
this.DragMove();
Das wars! Das Fenster lässt sich jetzt an allen Stellen verschieben, wo kein Steuerelement im Vordergrund ist. Hat man den Code in das MouseLeftButtonDown-Ereignis eines Steuerelements eingefügt, so lässt sich das Fenster nur mit dem Steuerelement verschieben.
Geschrieben in Tipps und Tricks, WPF | Tags: Fenster • WPF
Shortlink | Trackbacks/Pingbacks (0) | Keine Kommentare »
Donnerstag, 7. April 2011, 17:33 von Dennis Duda
Die Standardknöpfe, die per Enter- und Escape-Taste gedrückt werden können, waren unter WinForms oft sehr hilfreich. Auch in der WPF gibt es dafür eine Lösung:
Setzen Sie im entsprechenden Button die Eigenschaft IsDefault für den “AcceptButton” beziehungsweise IsCancel für den “CancelButton” auf True.
Geschrieben in Tipps und Tricks, WPF | Tags: Button • WPF
Shortlink | Trackbacks/Pingbacks (0) | Keine Kommentare »