Benutzer mit den meisten Antworten
WPF Rahmenfarbe ändern bei Combobox funktioniert nicht

Frage
-
Hallo,
ich habe eine Powershell-Script mit WPF-Dialog.
Das Verändern der Rahmenfarbe einer TextBox funktioniert problemlos:
$Form1.FindName("TextBox1").BorderBrush ="#FFFF0000"
Das Verändern der Rahmenfarbe einer Combobox hingegen funktioniert überhaupt nicht:
$Form1.FindName("ComboBox3").BorderBrush ="#FFFF0000"
Woran kann das liegen? Muss ich irgendeine Einstellung der Combobox beachten?
Besten Dank und viele Grüße
Heike
Antworten
-
Stimmt, unter Windows 8 ist auch bei mir alles grau.
Und es scheint tatsächlich am Windows Aero Theme zu liegen. Leider komme ich da auch nicht weiter, aber vielleicht jemand anderes aus dem Forum.
Hier solang ein kleiner Workaround: einfach um das ComboBox Element ein einzelnes Border Element von gleicher Größe und Position legen und mit einer beliebigen Aktion den Wert abfragen (z.B. wenn etwas aus der Liste ausgewählt wurde)
function Convert-XAMLtoWindow { param ( [Parameter(Mandatory=$true)] [string] $XAML, [string[]] $NamedElements, [switch] $PassThru ) Add-Type -AssemblyName PresentationFramework $reader = [System.XML.XMLReader]::Create([System.IO.StringReader]$XAML) $result = [System.Windows.Markup.XAMLReader]::Load($reader) foreach($Name in $NamedElements) { $result | Add-Member NoteProperty -Name $Name -Value $result.FindName($Name) -Force } if ($PassThru) { $result } else { $result.ShowDialog() } } $xaml = @' <Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <Grid> <ComboBox Name="combo" HorizontalAlignment="Left" Margin="185,137,0,0" VerticalAlignment="Top" Width="120" /> <Border Name="border" BorderThickness="1" HorizontalAlignment="Left" Height="22" Margin="185,137,0,0" VerticalAlignment="Top" Width="120"/> </Grid> </Window> '@ $window = Convert-XAMLtoWindow -XAML $xaml -NamedElements 'combo', 'border' -PassThru $window.combo.add_DropDownClosed( { [System.Object]$sender = $args[0] [System.EventArgs]$e = $args[1] if ($window.combo.Text -eq 'rot') { $window.border.BorderBrush = 'red' } if ($window.combo.Text -eq 'blau') { $window.border.BorderBrush = 'blue' } } ) $window.combo.AddText('rot') $window.combo.AddText('blau') $window.ShowDialog() | Out-Null
Gruß,
- Als Antwort vorgeschlagen Denniver ReiningMVP, Moderator Mittwoch, 20. Mai 2015 13:06
- Als Antwort markiert Denniver ReiningMVP, Moderator Samstag, 23. Mai 2015 00:10
Alle Antworten
-
Moin,
funktioniert bei mir problemlos, allerdings ist dein ColorCode 8-stellig (es sollten 6 sein). Vielleicht wird es dadurch falsch oder garnicht interpretiert. (seltsamer weise wohl nur bei der combobox?)
$window.combo.BorderBrush = '#FFFF00' - ist bei mir gelb
$window.combo.BorderBrush = '#FF0000' - ist bei mir rot
$window.combo.BorderBrush = '#FFFF0000' - ist bei mir ebenfalls rot
Gruß,
Alexander
-
Besten Dank für die Antwort.
Leider funktioniert es bei mir immer noch nicht.
Auch wenn ich meinen Dialog im Visual Studio überarbeite, kann ich bei allen anderen Elementen die Farben (Rahmen, Vordergrund, Hintergrund) ändern. Nur bei der Combobox funktioniert das auch dort nicht.
Hat die Combobox noch irgend eine Eigenschaft, die erst gesetzt / ausgeschaltet sein muss, damit sich die Farben ändern können?
Viele Grüße
Heike
-
Soweit ich weiß, muss man keine weitere Eigenschaft mitgeben.
Schau mal wie sich der folgende Code bei dir verhält.
ComboBox1 wird direkt im xaml code die Farbe zugewiesen
ComboBox2 wird die Farbe nachträglich als hex Wert zugewiesen
ComboBox3 wird die Farbe nachträglich als Wort zugewiesen
Alle drei sind bei mir rot.
function Convert-XAMLtoWindow { param ( [Parameter(Mandatory=$true)] [string] $XAML, [string[]] $NamedElements, [switch] $PassThru ) Add-Type -AssemblyName PresentationFramework $reader = [System.XML.XMLReader]::Create([System.IO.StringReader]$XAML) $result = [System.Windows.Markup.XAMLReader]::Load($reader) foreach($Name in $NamedElements) { $result | Add-Member NoteProperty -Name $Name -Value $result.FindName($Name) -Force } if ($PassThru) { $result } else { $result.ShowDialog() } } $xaml = @' <Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Topmost="False" SizeToContent="Height" Title="Combo Color" MinHeight="355" Width="531"> <Grid Background="#FFE5E5E5"> <StackPanel Margin="10"> <ComboBox Name="combo1" Margin="10" BorderBrush="red"></ComboBox> <ComboBox Name="combo2" Margin="10"></ComboBox> <ComboBox Name="combo3" Margin="10"></ComboBox> </StackPanel> </Grid> </Window> '@ $window = Convert-XAMLtoWindow -XAML $xaml -NamedElements 'combo1', 'combo2', 'combo3' -PassThru #rot als code $window.combo2.BorderBrush = '#FF0000' #rot als wort $window.combo3.BorderBrush = 'red' $window.ShowDialog()
Gruß,
- Bearbeitet psott Dienstag, 19. Mai 2015 14:14
-
bei mir sind alle 3 Boxen grau.
Arbeitest Du auf einer NICHT-Windows 8-Maschine? Ich habe einen Hinweis gefunden, dass unter Win8 die Comboboxen anders angesprochen werden und daher die Zuweisung von Farben nicht mehr wie vorher funktioniert.
Die Lösung für das Problem fehlt aber noch.
Viele Grüße Heike
-
Stimmt, unter Windows 8 ist auch bei mir alles grau.
Und es scheint tatsächlich am Windows Aero Theme zu liegen. Leider komme ich da auch nicht weiter, aber vielleicht jemand anderes aus dem Forum.
Hier solang ein kleiner Workaround: einfach um das ComboBox Element ein einzelnes Border Element von gleicher Größe und Position legen und mit einer beliebigen Aktion den Wert abfragen (z.B. wenn etwas aus der Liste ausgewählt wurde)
function Convert-XAMLtoWindow { param ( [Parameter(Mandatory=$true)] [string] $XAML, [string[]] $NamedElements, [switch] $PassThru ) Add-Type -AssemblyName PresentationFramework $reader = [System.XML.XMLReader]::Create([System.IO.StringReader]$XAML) $result = [System.Windows.Markup.XAMLReader]::Load($reader) foreach($Name in $NamedElements) { $result | Add-Member NoteProperty -Name $Name -Value $result.FindName($Name) -Force } if ($PassThru) { $result } else { $result.ShowDialog() } } $xaml = @' <Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <Grid> <ComboBox Name="combo" HorizontalAlignment="Left" Margin="185,137,0,0" VerticalAlignment="Top" Width="120" /> <Border Name="border" BorderThickness="1" HorizontalAlignment="Left" Height="22" Margin="185,137,0,0" VerticalAlignment="Top" Width="120"/> </Grid> </Window> '@ $window = Convert-XAMLtoWindow -XAML $xaml -NamedElements 'combo', 'border' -PassThru $window.combo.add_DropDownClosed( { [System.Object]$sender = $args[0] [System.EventArgs]$e = $args[1] if ($window.combo.Text -eq 'rot') { $window.border.BorderBrush = 'red' } if ($window.combo.Text -eq 'blau') { $window.border.BorderBrush = 'blue' } } ) $window.combo.AddText('rot') $window.combo.AddText('blau') $window.ShowDialog() | Out-Null
Gruß,
- Als Antwort vorgeschlagen Denniver ReiningMVP, Moderator Mittwoch, 20. Mai 2015 13:06
- Als Antwort markiert Denniver ReiningMVP, Moderator Samstag, 23. Mai 2015 00:10
-