none
Hintergrund und Text vom ListView sollen trotz IsEnabled = false nicht grau sein RRS feed

  • Frage

  • Hallo,
    ich setze das Control ListView ein. Der Anwender soll nur informiert werden und soll keine Änderungen oder Auswahl vornehmen können.
    Deshalb habe ich IsEnabled = False gesetzt.
    Die Schrift soll aber schwarz und der Hintergrund transparent sein.
    Deshalb habe ich einen Style definiert, der die notwendigen Eigenschaften setzen soll.

    <Style.Setters>
     <Setter Property="IsEnabled" Value="False" />
     <Setter Property="Background" Value="Transparent" />
     <Setter Property="Foreground" Value="Black" />
    </Style.Setters>

    ListView ist danach nicht enabled, aber der ListView-Hintergrund und die Schrift trotzdem grau.
    Wie komme ich zum Ziel?


    Alexander

    Mittwoch, 18. November 2015 09:18

Antworten

  • Hallo Alexander,

    da wirst du ,denke ich, nicht drumrum kommen, einen eigenen Style zu erstellen, den du der ListView dann zuweist. Ich hab dir mal ein Beispiel gemacht:

    <Window.Resources>
            <Style x:Key="EnabledLookStyle" TargetType="{x:Type ListView}">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="ListView">
                            <Border Name="Border" Background="White" BorderBrush="LightGray" BorderThickness="1">
                                <ScrollViewer Style="{DynamicResource {x:Static GridView.GridViewScrollViewerStyleKey}}">
                                    <ItemsPresenter />
                                </ScrollViewer>
    
                            </Border>
                            
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </Window.Resources>
        
            <ListView Style="{StaticResource EnabledLookStyle}">        
                <ListViewItem>Item One</ListViewItem>
                <ListViewItem >Item Two</ListViewItem>
                <ListViewItem IsSelected="True">And Three</ListViewItem>
            </ListView>

    Eventuell kannst es dann mit auch mit Triggern versehen. z.B.

    <ControlTemplate.Triggers>
                                <Trigger Property="IsEnabled" Value="false">
                                    <Setter TargetName="Border" Property="Background" Value="White" />
                                    <Setter TargetName="Border" Property="BorderBrush" Value="Gray" />
                                    <Setter Property="Foreground" Value="Gray" />
                                </Trigger>
                                <Trigger Property="IsGrouping" Value="true">
                                    <Setter Property="ScrollViewer.CanContentScroll" Value="false"/>
                                </Trigger>
    </ControlTemplate.Triggers>

    DAbei wird ein einfaches Template im Style erzeugt, das einfach das vom Framework genutzte Style überschreibt.

    Gruß Claudius

    • Als Antwort markiert AlexanderRi Donnerstag, 19. November 2015 14:48
    Mittwoch, 18. November 2015 09:58

Alle Antworten

  • Hallo Alexander,

    da wirst du ,denke ich, nicht drumrum kommen, einen eigenen Style zu erstellen, den du der ListView dann zuweist. Ich hab dir mal ein Beispiel gemacht:

    <Window.Resources>
            <Style x:Key="EnabledLookStyle" TargetType="{x:Type ListView}">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="ListView">
                            <Border Name="Border" Background="White" BorderBrush="LightGray" BorderThickness="1">
                                <ScrollViewer Style="{DynamicResource {x:Static GridView.GridViewScrollViewerStyleKey}}">
                                    <ItemsPresenter />
                                </ScrollViewer>
    
                            </Border>
                            
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </Window.Resources>
        
            <ListView Style="{StaticResource EnabledLookStyle}">        
                <ListViewItem>Item One</ListViewItem>
                <ListViewItem >Item Two</ListViewItem>
                <ListViewItem IsSelected="True">And Three</ListViewItem>
            </ListView>

    Eventuell kannst es dann mit auch mit Triggern versehen. z.B.

    <ControlTemplate.Triggers>
                                <Trigger Property="IsEnabled" Value="false">
                                    <Setter TargetName="Border" Property="Background" Value="White" />
                                    <Setter TargetName="Border" Property="BorderBrush" Value="Gray" />
                                    <Setter Property="Foreground" Value="Gray" />
                                </Trigger>
                                <Trigger Property="IsGrouping" Value="true">
                                    <Setter Property="ScrollViewer.CanContentScroll" Value="false"/>
                                </Trigger>
    </ControlTemplate.Triggers>

    DAbei wird ein einfaches Template im Style erzeugt, das einfach das vom Framework genutzte Style überschreibt.

    Gruß Claudius

    • Als Antwort markiert AlexanderRi Donnerstag, 19. November 2015 14:48
    Mittwoch, 18. November 2015 09:58
  • Hallo Claudius,
    danke für die Hilfe. Es funktioniert fast.
    Leider sehe ich immer den ScrollViewer am oberen Rand der ListView; wie ein Header (grauer Balken ohne die Scrollbutton).
    Dieser wird auch dann angezeigt, wenn keine Notwendigkeit zum Scrollen besteht.
    Wenn der Inhalt Breite oder Höhe überschreitet, dann funktioniert der ScrollViewer.

    <ScrollViewer Style="{DynamicResource {x:Static GridView.GridViewScrollViewerStyleKey}}">
        <ItemsPresenter IsEnabled="False" />
    </ScrollViewer>

    Ohne <ScrollViewer ... /> auch kein grauer Balken am oberen Rand.
    Wie kann ich den Balken am oberen Rand der ListView unsichtbar setzen, wenn keine Notwendigkeit besteht?


    Alexander

    Mittwoch, 18. November 2015 16:09
  • Hallo Alexander,

    das ist recht einfach. Lösche einfach das Attribut

     Style="{DynamicResource {x:Static GridView.GridViewScrollViewerStyleKey}}"

    sodass es wiefolgt aussieht

     <ScrollViewer>
         <ItemsPresenter />
    </ScrollViewer>

    Dann ist der Header weg.

    Gruß Claudius

    Donnerstag, 19. November 2015 13:26