none
WPF Rahmenfarbe ändern bei Combobox funktioniert nicht RRS feed

  • 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

    Dienstag, 12. Mai 2015 09:14

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ß,


    Dienstag, 19. Mai 2015 19:06

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

    Montag, 18. Mai 2015 14:49
  • 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

    Dienstag, 19. Mai 2015 13:39
  • 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
    Dienstag, 19. Mai 2015 14:13
  • 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

    Dienstag, 19. Mai 2015 14:58
  • 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ß,


    Dienstag, 19. Mai 2015 19:06
  • gute Idee.

    Danke Dir für die Mühe!

    Heike

    Mittwoch, 20. Mai 2015 07:50