WPF: Style für alle Controls eines Typs

5. Juli 2011

Styles sind in WPF eine Möglichkeit, visuelle Eigenschaften, die für mehrere Controls gelten sollen, an zentraler Stelle zu definieren und den Controls zuzuweisen. Dies erspart zum Einen Schreibaufwand und zum Anderen Zeit, wenn eine dieser Einstellungen geändert werden soll. In diesem Post soll es aber nicht um die Basics von Styles gehen, sondern um den Anwendungsfall, dass man einen Style für alle Controls eines bestimmten Typs definiert.

Nehmen wir an, wir haben ein Window mit zwei GroupBoxes, die jeweils zwei TextBlocks enthalten:

<Window x:Class="StylesExample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Styles" Height="200" Width="200">
    <StackPanel>
        <GroupBox Header="Vornamen">
            <StackPanel>
                <TextBlock Text="Petra" />
                <TextBlock Text="Michael" />
            </StackPanel>
        </GroupBox>
        <GroupBox Header="Nachnamen">
            <StackPanel>
                <TextBlock Text="Müller" />
                <TextBlock Text="Meier" />
            </StackPanel>
        </GroupBox>
    </StackPanel>
</Window>

Sieht als Ergebnis so aus:

Nun wollen wir allen TextBlocks einen gelben Hintergrund und einen Margin von 3 verpassen. Ein Weg wäre, den Style in den Window-Ressourcen zu definieren und bei jedem TextBlock das Style-Property anzugeben. Dies bedeutet aber wieder, dass wir bei jedem zusätzlichen TextBlock mehr schreiben müssen. Schöner wäre es doch, wenn wir direkt angeben könnten, dass der Style für alle TextBlock-Controls gelten soll. Dies geschieht, indem man einem Style nur den TargetType mitgibt, aber keinen Key:

<Window.Resources>
    <Style TargetType="TextBlock" >
        <Setter Property="Background" Value="Yellow" />
        <Setter Property="Margin" Value="3" />
    </Style>
</Window.Resources>

Starten wir die Anwendung jetzt, sieht das Ergebnis folgendermaßen aus:

Da wir den Style in den Ressourcen des Windows definiert haben, wird er auf alle TextBlock-Controls innerhalb des Windows angewendet. Würden wir ihn in den Ressourcen einer der GroupBoxes definieren, würde er nur für die TextBlock-Controls dieser GroupBox gelten. Möchten wir also, dass die Vornamen einen hellgrünen Hintergrund bekommen, definieren wir einen neuen Style innerhalb der ersten GroupBox:

<GroupBox.Resources>
    <Style TargetType="TextBlock" >
        <Setter Property="Background" Value="LightGreen" />
        <Setter Property="Margin" Value="3" />
    </Style>
</GroupBox.Resources>

Für alle TextBlock-Controls der Vornamen-GroupBox gilt nun der Style aus den GroupBox-Ressourcen, während für alle anderen TextBlock-Controls weiterhin der Style aus den Window-Ressourcen gilt.

Jetzt kann es aber natürlich vorkommen, dass eines der TextBlock-Controls einen abweichenden Style bekommen soll, zum Beispiel wenn der TextBlock “Meier” fett erscheinen soll. Kein Problem, setzen wir einfach einen Style für das Control:

<TextBlock Text="Meier">
    <TextBlock.Style>
        <Style TargetType="TextBlock">
            <Setter Property="FontWeight" Value="Bold" />
        </Style>
    </TextBlock.Style>
</TextBlock>

Wie wir sehen, führt uns das aber nicht wirklich zum Ziel. Die Schrift ist jetzt zwar fett, aber der Standard-Style ist verloren gegangen. Wir müssen also einen Weg finden, um den neuen Style auf dem Standard-Style basieren zu lassen. Dazu bietet jeder Style ein BasedOn-Property, über das der Basis-Style für den Style angegeben werden kann. Nun haben die Styles, die für alle Controls in ihrem Kontext gelten, aber keinen Key, über den wir sie ansprechen können. Zumindest keinen, den wir angegeben haben. Intern vergibt WPF aber dennoch einen Key, nämlich den Type des Target-Controls. Und über diesen können wir den Standard-Style ansprechen:

<Style TargetType="TextBlock" BasedOn="{StaticResource {x:Type TextBlock}}">
    <Setter Property="FontWeight" Value="Bold" />
</Style>

So kommen wir zu unserem gewünschen Ergebnis:


Twitter-Highlights Juni 2011

4. Juli 2011

Gut, dass wir drüber geredet haben…

3. Juli 2011

Es begab sich an irgendeinem Nachmittag in irgendeiner Stadt, dass der örtliche Rettungswagen, der Notarzt und der Einsatzleiter Rettungsdienst zu einem Einsatz alarmiert wurden. Laut Einsatzmeldung drohte eine Person damit, in der Innenstadt von einem Hausdach zu springen.

Die Autos waren auf der Anfahrt, als die Leitstelle Details zum Aufstellungsort durchgab. Kurz darauf meldete sich jemand am Funk:

“Leitstelle für den Einsatzleiter Bergwacht”

“Kommen Sie!”

“Da vor Ort auf dem Dach sind heute zwei meiner Leute zur Absicherung von Filmaufnahmen. Bitte mal abklären, nicht, dass da jemand denkt, dass meine Leute vom Dach springen wollen”.

Nach einer knappen Minuten Pause meldete sich die Leitstelle wieder:

“RTW, NEF, Einsatzleiter Rettungsdienst – für Sie Einsatzende!”


WPF: Controls abhängig von CheckBox disablen

2. Juli 2011

Ein nicht seltener Usecase in einer Anwendung ist eine Checkbox, die zusätzliche Felder zum Editieren freigibt, zum Beispiel für eine abweichende Lieferadresse. In diesem kurzen Post will ich zeigen, wie sich das in WPF ganz leicht direkt im XAML eines Windows oder UserControls umsetzen lässt. Als erstes basteln wir uns die View, welche innerhalb des Root-Layout-Grids eine GroupBox enthält:

        <GroupBox Margin="5">
            <GroupBox.Header>
                <CheckBox x:Name="deliveryAddressCheckBox" 
                          Content="Abweichende Lieferadresse" />
            </GroupBox.Header>
            <Grid Margin="2">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="*" />
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                </Grid.RowDefinitions>
                <Label Content="Vorname" Grid.Column="0" Grid.Row="0" />
                <TextBox Text="Peter" Margin="2" 
                         Grid.Column="1" Grid.Row="0" />
                <Label Content="Nachname" Grid.Column="0" Grid.Row="1" />
                <TextBox Text="Müller" Margin="2" 
                         Grid.Column="1" Grid.Row="1" />
            </Grid>
        </GroupBox>

Ausgeführt sieht das Ganze so aus:

 

Nun wollen wir, dass die TextBoxes für Vor- und Nachname nur editierbar sind, wenn die Checkbox gechecked ist. Unter WinForms müssten wir dazu einen Handler an das Click-Event der Checkbox hängen und dort im Code-Behind das Enabled-Property für die beiden TextBoxes setzen. WPF macht uns die Sache da bedeutend leichter und bietet dank Binding die Möglichkeit, diesen Usecase direkt im XAML abzubilden. Dafür binden wir einfach die IsEnabled-Properties an das IsChecked-Property der CheckBox:

<TextBox Text="Peter" Margin="2" 
  Grid.Column="1" Grid.Row="0"
  IsEnabled="{Binding ElementName=deliveryAddressCheckBox, Path=IsChecked}"
/>

Wenn wir die Anwendung nun starten, sieht das Ergebnis so aus:

Und wenn wir auf die Checkbox klicken, können die Felder editiert werden:

 

Ein, wie ich finde, kleines, aber feines Beispiel dafür, wie WPF einem das Leben einfacher macht. Das komplette XAML-File gibt es hier: Klick!


Suchbegriffe II

28. Juni 2011

Mal wieder ein paar Sachen, mit denen Leute auf dieser Seite gelandet sind…

fahrplanreserven Gibt’s bei der Bahn, teilweise sogar nicht zu knapp. Ermöglicht energiesparendes und umweltfreundliches Fahren. Auch ein paar Minuten Verspätung können so durchaus wieder aufgeholt werden.

beispiele ch in bayern Frag die Bayern einfach mal, wie dieses längliche Land im Südwesten Südamerikas heißt ;)

andreas frauentausch sticker aufkleber Haha, was ‘ne geile Idee!

witzige krankenhaus geschichten Findest du hier.

brief an die krankenkasse Meinen kannst du hier nachlesen. Mittlerweile haben sie es sogar geschafft, mir zu schreiben, was sie wollen… War denen wohl noch ein bisschen Geld schuldig.

was wurde aus psychopath andreas Gute Frage! Ein Kumpel hat mir letzt ein Video geschickt, wo man sieht, wie der gute Andreas auf die Lügenrede von zu Guttenberg reagiert. Zuuu lustig!

ich sah meine frau mit ihrem chef ficken Hoffentlich bringt sie jetzt mehr Geld nach Hause…

lästern therapeuten über ihre klienten Ich kann es mir kauuuum vorstellen ;)

arbeiten und leben in bayern Meistens passt das schon…


Endhaltestelle (Teil 1 – Erinnerungen)

9. Juni 2011

Peter verstaute den Schuhkarton in seinem Rucksack und verließ den Treffpunkt, um zum nahegelegenen Bahnhof zu gehen. Dort stand ihm gleich die erste Bewährungsprobe bevor, denn er musste an einer Gruppe Polizisten vorbei, die dort gerade gelangweilt rumstanden. “Bloß nicht auffallen”, dachte er sich, “und bloß nicht auffallend unauffällig sein. Einfach ganz normal…” Damit die Polizisten nicht bemerkten, dass er den direkten Blickkontakt vermied, griff er zum uralten Trick und holte seine Handy aus der Hose, um ein bisschen alibimäßig darauf herumzutippen. Nachdem das erfolgreich klappte, ging Peter zum Bahnsteig, an dem seine S-Bahn ins Hotel fahren sollte. Der Bahnhof lag mitten in der Stadt und war daher durch viele Touristen bevölkert, die Peter während seiner Wartezeit beobachtete. Da war zum Beispiel das Pärchen, das vor dem U- und S-Bahnplan stand und aufgeregt auf Englisch diskutierte. Vermutlich würden sie gleich zum Service-Mitarbeiter gehen, welcher mit der englischen Sprache hoffnungslos überfordert sein würde, so wie alle Service-Mitarbeiter der Bahn, die am Wochenende an Touristen-Knotenpunkten eingesetzt werden.

Peters S-Bahn fuhr ein und er fand gleich einen Sitzplatz in einer der ruhigeren Ecken am Wagenende. Er schaltete seinen MP3-Player ein und guckte aus dem Fenster. Nach ein paar Minuten Fahrt kam die Bahn an einer Stelle vorbei, bei der Peter jedes Mal zusammenzucken musste. Es war die Stelle, an der sein persönlicher Albtraum begann: Vor 10 Jahren ging Peter in die 9. Klasse zur Schule. Er war aber schon immer eher der Typ Außenseiter. Zwar ziemlich schlau und daher in den meisten Fächern mit sehr guten Noten, aber eigensinnig, egoistisch und ohne wirkliche Freunde. In die gleiche Klasse ging auch Matthias, der das genaue Gegenteil von Peter war: Beliebt, viele Freunde, aber sehr schlechte Noten. Und Matthias konnte Peter nicht leiden und machte ihn fertig, wann immer es ging. Matthias war gleichzeitig der Klassenanführer und so machten alle Anderen beim Mobbing von Peter mit, um auch so cool zu sein, wie Matthias. Dieses Mobbing war wechselweise schwächer oder stärker. Mal verschwanden nur Arbeitsmaterialien, mal wurde er ständig beleidigt, mal rumgeschubst. Aber das, was an diesem Tag passierte, sollte alles übertreffen. Die Klasse war auf dem Rückweg von einem Ausflug in der Stadt, wo man ein Museum besucht hatte. Die Lehrer hatten sich schon verabschiedet, da sie in einer anderen Ecke der Stadt wohnten. Peter hatte danach noch ein Geburtstagsgeschenk für seine Mutter eingekauft, eine besondere Porzellanfigur, die sie unbedingt haben wollte, um ihre Sammlung zu vervollständigen. Danach machte er sich auf den Weg zum nächsten Bahnhof, der allerdings einige Gehminuten weg lag. So lief er unterwegs auf die Anderen aus seiner Klasse auf, die gemütlich unterwegs waren. Da er es eilig hatte, wollte er sie schnell überholen, doch als sie ihn sahen, wollten sie ihn nicht gehen lassen. Paul, der beste Freund von Matthias, riss ihn um und schubste ihn gegen eine Hauswand. “Was soll das? Lasst mich in Ruhe!”, schrie Peter. “Halt die Fresse, du dreckiger Streber! Guck dich doch mal an!”, brüllte Paul zurück und schubste ihn wieder gegen die Wand. Peter landete so ungünstig an dieser, dass die Porzellanfigur für seine Mutter in tausend Einzelteile zerbrach. Er guckte in seinen Rucksack und sah den Scherbenhaufen. Er hatte ein halbes Jahr darauf gespart und mehrere Ferienjobs erledigt, nur um seiner Mutter diesen Wunsch erfüllen zu können. Er hatte sich schon ihr Lächeln und ihre Freude beim Auspacken des Geschenks vorgestellt. Und jetzt hatten die Jungs aus seiner Klasse diesen Traum kaputt gemacht. Das war zu viel für ihn und er fing an, zu weinen. Das war natürlich gefundenes Fressen für die Anderen: “Hahaha, guckt euch dieses Mädchen an. Jetzt flennt er hier rum. Ey, Schwuchtel, brauchst du ein Taschentuch?”, grölte Matthias. In Peter stieg eine unfassbare Wut hoch und die musste raus: Er sprang auf Matthias zu und schlug zu. Und wieder. Und wieder. Und wieder. Matthias war von dem Angriff völlig überrascht und konnte sich nicht mehr wehren. Peter schlug sich in einen Rausch und haute immer wieder zu. Von den Umherstehenden ging niemand dazwischen und auch als Matthias zu Boden ging, schlug und trat Peter weiter auf ihn ein. All der aufgestaute Hass, all die seelische Folter der letzten Jahre in der Klasse fand so seinen Weg nach draußen. Erst, als zwei zufällig vorbeikommende Zivilpolizisten eingriffen, ließ Peter von Matthias ab. Für den kam die Hilfe zu spät, denn dieser Angriff hatte Folgen: Matthias war aufgrund der bleibenden Schäden für den Rest seines Lebens an den Rollstuhl gebunden.

Ein paar Monate später kam es zum Prozess gegen Peter. Er beschrieb die Mobbing-Attacken der letzten Jahre und was zu seinem Ausraster geführt hatte. Erklären konnte er sich diesen auch nicht, noch nie zuvor war er in eine Schlägerei verwickelt gewesen, hatte alle Konflikte mit Wörtern oder Aussitzen gelöst. Obwohl er von sich selber entsetzt war, konnte er sich nicht zu einer Entschuldigung gegenüber Matthias durchringen: “Er hat letztendlich dann doch bekommen, was er sich über all die Jahre verdient hatte”. Das war natürlich nicht gerade das, was der Richter hören wollte. Dazu kam, dass alle Zeugen aus seiner Klassen einstimmig aussagten, dass es das Mobbing in den letzten Jahren nicht gegeben hatte und Peter an diesem Tag völlig grundlos auf Matthias losgegangen war. Am Ende wurde Peter zu fünf Jahren Jugendgefängnis verurteilt.

Vor fünf Jahren war er aus dem Knast gekommen. Seine Schule konnte er dort zum Glück zu Ende bringen und am Ende sogar Abitur machen. Dank der Unterstützung seiner Eltern fand er recht schnell zurück ins Leben und zog in eine weit entfernte Stadt, wo er BWL studierte.

Nun war er also zurück in seiner Heimat, um mit der Vergangenheit aufzuräumen. Erst jetzt fiel ihm die blonde Frau, die ihm gegenüber saß, auf. Sie kam ihm irgendwie bekannt vor, aber er konnte sie nicht einordnen. “Verdammt! Woher kenne ich die nur?”, grübelte er. Die Frau schien das Gleiche zu denken, denn sie guckte Peter an und fragte: “Entschuldigung? Kennen wir uns vielleicht irgendwoher?”…


Gastbeitrag: Erna – Retterin vom Erdbeerfeld (Teil 3)

6. Juni 2011

Ich rannte so schnell ich konnte wieder ins Haus. Von wem kam der Schrei? Hatte Mark etwa die Schlange gefunden? Meine Herzfrequenz erhöhte sich schlagartig und meine Atemzüge wurden tiefer. Ich hatte Angst, dass die Schlange auch Mark gebissen haben könnte. Als ich am Schauplatz ankam, sah ich Mark, wie er sich den Unterarm hielt und vor Schmerzen fluchte. Und ich sah die Frau des Patienten die bitterlich weinte.

“So ein Scheiß!!!”

“Mark! Oh Gott! … Die Schlange… hahaaat sie dich gebissen? Hab keine Angst ich werde sofort Hilfe nachfordern. Du wirst nicht sterben! Dafür sorge ich!”

“Pummelchen…was ist los?! Aaaaah kacke tut das weh!”

“Naaa… dein… Schlangenbiss!”

“Das nicht die Schlange! Das war der da!”

“Wer?”

“Der Patient, du lange Leitung!”

“Äaah… wie der Patient?”

“Ich hatte mal was mit seiner Frau…”

“Maaaark!?!?!?”

Das darf doch nicht wahr sein… So ein Vollidiot! Ich stelle mir vor, wie wir diesen Arbeitsunfall der Versicherung erklären: “Rettungsassistent verletzt am Unterarm durch Biss des Patienten, da der RettAss ein Verhältnis mit der Frau des Pat. hatte.” Unser Patient wurde ins nächste Klinikum geflogen und seine Frau fuhr mit dem Auto hinterher. Mark dagegen demolierte vor Wut die KTW-Einrichtung. Selbst Schuld wenn er nur mit seinen Schwanz denken kann. Ich verband seinen Arm und fuhr ihn in die Ambulanz zur Wundversorgung. Während Mark behandelt wurde, saß ich im Auto und grübelte vor mich hin: Warum ist dieser Mann so? Er ist sicherlich von seiner großen Liebe enttäuscht worden und jetzt hat er Angst wieder verletzt zu werden. Also kapselt er sich ab und lässt keine tieferen Beziehungen zu… Ich hätte Psychologin werden sollen, aber der Job ist auf Dauer auch zu langweilig: Die meisten Menschen sind doch gleich gestrickt. Im Grunde gibt es nur zwei Arten von Beziehungen: Die, wo beide nur geil aufeinander sind und die, in der die Partner eine Abhängigkeit entwickeln, die man “Liebe” nennt. Aber warum glauben wir dann an die große Liebe? Warum glauben wir an Gott? Ich sollte nicht so viel denken…


Twitter-Highlights Mai 2011

1. Juni 2011

Endhaltestelle (Prolog)

25. Mai 2011

Peter war nervös. Immer wieder musterte er genau die Gegend, um sicherzustellen, dass ihn niemand entdeckte. Niemand wusste, dass er wieder in der Stadt war und das sollte auch so bleiben. Er hatte lange auf die Möglichkeit gewartet und sie nun vor ein paar Tagen bekommen. Von Anfang an war er sehr vorsichtig: sein Hotel lag weit außerhalb der Stadt und er vermied es, am Tag unterwegs zu sein. Denn wenn ihn die falschen Leute sehen würden, wäre alles vorbei, bevor es angefangen hat.

Es war eine klare Frühlingsnacht, nicht zu warm, nicht zu kalt. Peter checkte noch mal, ob er genügend Geld dabei hatte. Dann ging er langsam und aufmerksam in Richtung der dunklen Ecke, in der er verabredet war. Dort wurde er schon erwartet:

“Bernd?”

“Ja. Sind Sie der Mann mit den Schuhen?”

“Ja. Hast du das Geld?”

“Klar. Aber zeigen Sie mir erst die Schuhe!”

Der Mann mit den Schuhen holte eine Plastiktüte vom örtlichen Discounter hervor, in der ein Schuhkarton war. Er öffnete diesen leicht und hielt ihn Peter hin.

“Perfekt, genau wie bestellt.”

“Natürlich. Ich liefere immer genau wie bestellt! Und jetzt das Geld!”

Peter gab ihm die 500 Euro und der Schuhhändler verschwand grußlos um die nächste Ecke. Nun hatte Peter die nötigen Dinge, um seinen Plan umzusetzen…


Quickie

22. Mai 2011

Kurzes Update:

  • Der Bußgeldbescheid für die Aktion mit den freundlichen Herren der Zivilpolizei ist gekommen. Sie sind mir 868 Meter messend hinterhergefahren und haben dabei eine Geschwindigkeit von 152,2 km/h festgestellt, wovon aber noch 8 km/h Toleranz abgezogen werden. Damit ist es doch nur ein Aufkleber für’s Sammelheft und wegen der 2 x >25-Regelung ( 2 x innerhalb von 12 Monaten mehr als 25 km/h zu schnell = 4 Wochen Fahrverbot) muss ich mir auch keine Sorgen mehr machen…
  • Die Ergebnisse vom MRT wegen der Patellalateralisations-Geschichte waren gut: der Knorpel ist in Ordnung. Allerdings wurde ein Enchondrom festgestellt, welches nun weiter abgeklärt werden muss… Demnächst darf ich mich also im CT verstrahlen lassen.
  • Meine liebe Krankenkasse hat sich seit meinem netten Brief nicht mehr gemeldet… Sie haben aber kurz zuvor bei meinen Eltern angerufen und versucht, so meine Nummer zu bekommen. Natürlich vergeblich. Bestätigt mein schlechtes Bild von diesen Vereinen…

Follow

Bekomme jeden neuen Artikel in deinen Posteingang.

Join 809 other followers