WPF Combobox ToggleButton Ersetzen
-
Hallo zusammen.
Habe mit Blender eine Kopie des Styles einer Combobox erzeugt. Nun möchte ich hier gerne den Style des ToogleButtons ersetzen.
Bisher ist dort im Template ein Microsoft_Windows_Themes:ScrollChrome. Dieses Möchte ich nun durch mein eigenes ersetzen.
Und zwar würde mir hier eigentlich ein einfacher Border genügen. Das einzige Problem das ich hier habe ist das Border nur MouseOver besitzt und kein IsPressed Property.
Was kann ich anstatt Border verwenden?
-
Natürlich Expression Blend und nicht Blender
-
Würde mich wundern wenn Microsoft_Windows_Themes:ScrollChrome ein IsPressed hat. IsPressed hat nur das entsprechende Control selber.
Wenn der Klick nicht mehr funktioniert hast du was am Template falsch verändert.
-
Also der Klick funktioniert schon noch.
Also Controltemplate des Buttons beinhaltet ein Grid und im Grid ist das Microsoft_Windows_Themes:ScrollChrome. Mehr nicht. Und darin ist über das Property ThemeColor="Metallic" die Farben festgelegt.
Hier kann ich nun zum einen aber nicht den Inhalt festlegen wie ich möchte nur eine Auswahl an Pfeilen. Und zum anderen möchte ich auch meine eigenen Farben verwenden. Und hier ist die Frage was ich anstatt dem ScrollChrome verwenden kann. Was MouseOver und IsPressed hat.
ScrollChrome mag kein IsPressed nach aussen haben. Aber irgendwie wird es ja indirekt trotzdem über das ThemeColor mit festgelegt.
-
Ein IsMouseOver hatts, haben alle WPFControls, aber ein IsPressed hat das ScrollChrome definitiv nicht.
Das Chrome klingt auch nach dem Container wo die einzelnen Items gehostet werden, diese definieren dann ihr klick selber.
Du kannst da Problemlos ein normalen Border verwenden. Wenn die Farbe bei MouseOver usw wechseln soll, machst du das in den Triggers selber.Zeig mal was du bisher versucht hast.
-
Die Farbe wechselt aber wenn ich drauf klicke. Irgendwo muss ja dann das IsPressed gesetzt werden.
Mousover bekomme ich hin. Aber IsPressed nicht.
So das hier habe ich:
<Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type ToggleButton}"> <Grid Background="{TemplateBinding Background}" SnapsToDevicePixels="true"> <Grid.ColumnDefinitions> <ColumnDefinition Width="*" /> <ColumnDefinition Width="Auto" SharedSizeGroup="ComboBoxButton" /> </Grid.ColumnDefinitions> <!-- <Microsoft_Windows_Themes:ScrollChrome x:Name="Chrome" Grid.Column="1" Width="{DynamicResource {x:Static SystemParameters.VerticalScrollBarWidthKey}}" HasOuterBorder="false" Microsoft_Windows_Themes:ScrollChrome.ScrollGlyph="None" Padding="1,0,0,0" RenderMouseOver="{TemplateBinding IsMouseOver}" RenderPressed="{TemplateBinding IsChecked}" ThemeColor="Metallic" /> --> <Border Grid.Column="1" Width="{DynamicResource {x:Static SystemParameters.VerticalScrollBarWidthKey}}" Padding="1,0,0,0"> <Label Content="{TemplateBinding Content}" /> <Border.Style> <Style TargetType="{x:Type Border}"> <Style.Triggers> <Trigger Property="IsMouseOver" Value="False"> <Setter Property="Background" Value="{StaticResource buttonBrush}" /> </Trigger> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="Background" Value="{StaticResource buttonMouseOverBrush}" /> </Trigger> </Style.Triggers> </Style> </Border.Style> </Border> </Grid> </ControlTemplate> </Setter.Value> </Setter>
-
Di brauchst das IsPressed nicht im Style vom Border, sondern vom Button selber.
Soweit ich weiß hat der ToggleButton auch ein BorderBrush, d.h. du kannst direkt gegen binden und es im Trigger umsetzen<Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type ToggleButton}"> <Grid Background="{TemplateBinding Background}" SnapsToDevicePixels="true"> <Grid.ColumnDefinitions> <ColumnDefinition Width="*" /> <ColumnDefinition Width="Auto" SharedSizeGroup="ComboBoxButton" /> </Grid.ColumnDefinitions> <Border Grid.Column="1" Width="{DynamicResource {x:Static SystemParameters.VerticalScrollBarWidthKey}}" Padding="1,0,0,0" BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}" BorderThickness="1"> <Label Content="{TemplateBinding Content}" /> </Border> </Grid> <ControlTemplate.Triggers> <Trigger Property="IsMouseOver" Value="False"> <Setter Property="Background" Value="{StaticResource buttonBrush}" /> </Trigger> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="Background" Value="{StaticResource buttonMouseOverBrush}" /> </Trigger> <Trigger Property="IsPressed" Value="True"> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter>
Wenn du im Border ein Property setzen willst welches du nicht per TemplateBinding vom Button beziehen kannst, kannst du dem Border auch ein x:Name geben und beim Setter mit TargetName das Objekt direkt ansprechen.
-
Das geht mal gar nicht.
Der Button ist nämlich aufgteilt in einer Combobox. Dabei ist der linke Teil durchsichtig und der rechte Teil nicht. Darum kann man in einer Combobox überall drauf klicken und die Liste öffnet sich. Und nicht nur auf den sichtbaren Teil der einem als Button angezeigt wird.
Wenn ich das nun mache was du gezeigt hast wird der ganze Button, also auch der durchsichtige Teil, farbig.
Und somit muss auch ScrollCrome ein IsPressed haben. Denn auserhalb von ScrollCrome ist ja im Standard der Combox auch nichts weiter implementiert das dies bezwecken würde.
-
Dann pass den Trigger einfach an, ich habe da überall den Background gebunden, beeinflusse halt einfach nur den Borderbrush und gut ist. Eventuell ist auch die Positionierung des ToggleButtons falsch
(Der Button hat sein Pressed State usw, und in Triggers innerhalb des Buttons beeinflusst er sein aussehen, der Border ist im Template ein teil des Aussehens des Buttons)
Genau so wie ich das gezeigt habe macht man das
Schau mal hier oben im Beispiel: http://msdn.microsoft.com/en-us/library/ms752094(v=vs.85).aspx (beim ComboBoxToggleButton)
Da siehst du es wunderbar, der Trigger des Buttons beeinflusst den Border.
-
Achso klar ich kann ja im Trigger sagen worauf ich den Setter anwenden will. Dank dir.
-
Wobei es nun noch nicht ganz funktioniert.
Den ButtonPressedBrush sieht man nur ganz kurz. Und nicht so lange die Combobox offen ist.
-
Ok. IsChecked ist das Stichwort.