[.net] Es gibt keinen ListBox.SelectionMode = "None", gibt es eine andere Möglichkeit, die Auswahl in einer Listbox zu deaktivieren?


Answers

Ich fand eine sehr einfache und unkomplizierte Lösung, die für mich funktioniert, ich hoffe, es würde auch für Sie tun

<ListBox ItemsSource="{Items}">
    <ListBox.ItemContainerStyle>
       <Style TargetType="{x:Type ListBoxItem}">
           <Setter Property="Focusable" Value="False"/>
       </Style>
    </ListBox.ItemContainerStyle>
</ListBox>
Question

Wie deaktiviere ich die Auswahl in einer ListBox?




Während die Antwort von @Drew Noakes in den meisten Fällen eine schnelle Lösung ist, gibt es einen kleinen Fehler, der beim Setzen der x: Static-Pinsel auftritt.

Wenn Sie die x: Static-Pinsel wie vorgeschlagen festlegen, übernehmen alle untergeordneten Steuerelemente innerhalb des Listenfeldelements diesen Stil.

Das bedeutet, dass dies zwar dazu führt, dass die Hervorhebung des Listenfeldelements deaktiviert wird, dies jedoch zu unerwünschten Effekten für die untergeordneten Steuerelemente führen kann.

Wenn Sie beispielsweise eine ComboBox in Ihrem ListBoxItem hätten, würde dies die Maus über die Hervorhebung innerhalb der ComboBox deaktivieren.

Erwägen Sie stattdessen, die VisualStates für die Ereignisse "Selected", "Nicht ausgewählt" und "MouseOver" so festzulegen, wie dies in der in diesem Stapelüberlauf-Thread erwähnten Lösung beschrieben wird: Entfernen der Steuermarkierung von ListBoxItem, nicht von untergeordneten Steuerelementen .

-Frinny




Vielleicht brauchen Sie nur die Funktionalität von ItemsControl? Es erlaubt keine Auswahl:

<ItemsControl ItemsSource="{Binding Prop1}" ItemTemplate="{StaticResource DataItemsTemplate}" />



Sie können einen Textblock über Ihrer Listbox platzieren, es wird nicht das Aussehen Ihrer Anwendung ändern und es wird auch nicht erlauben, irgendeinen Gegenstand auszuwählen.




Für mich beste Lösung ist:

        <ListBox.ItemContainerStyle>
            <Style TargetType="{x:Type ListBoxItem}">
                <Setter Property="Focusable" Value="True"/>
                <Setter Property="IsHitTestVisible" Value="False" />
            </Style>
        </ListBox.ItemContainerStyle>



Eine weitere denkbare Option ist das Deaktivieren der ListBoxItems. Dies kann durch Festlegen des ItemContainerStyle wie im folgenden Codefragment gezeigt erfolgen.

<ListBox ItemsSource="{Binding YourCollection}">
    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Setter Property="IsEnabled" Value="False" />
        </Style>
    </ListBox.ItemContainerStyle>
</ListBox>

Wenn der Text nicht grau sein soll, können Sie die deaktivierte Farbe angeben, indem Sie den Ressourcen des Stils einen Pinsel mit dem folgenden Schlüssel hinzufügen: {x: Static SystemColors.GrayTextBrushKey}. Die andere Lösung wäre, die ListBoxItem-Steuerelementvorlage zu überschreiben.




Hallgeir Engens Antwort ist eine gute Lösung, aber das Problem ist, dass nach dem Zurücksetzen des Posts alle Elemente wieder auswählbar werden. Daher müssen Sie in Page_Load jedes ListItem das deaktivierte Attribut hinzufügen.

Aber es gibt noch eine einfachere Lösung.

Anstatt alle ListItems zu deaktivieren, können Sie die ListBox selbst nur einmal deaktivieren, und alle Listeneinträge sind ebenfalls deaktiviert. set Enabled auf false, deaktiviert das ListBox überhaupt nicht , aber das Hinzufügen der folgenden Zeile in dem Page_Load bewirkt:

this.listbox.Attributes.Add("disabled", "disabled");

Nach dem Zurücksetzen werden die Elemente nicht mehr auswählbar, sodass Sie diese Codezeile einfügen können:

if (!this.IsPostBack)
{
}

Alle Elemente sind jedoch immer noch grau überlagert. Wenn Sie also alle Elemente farbig darstellen möchten, erstellen Sie die CSS-Klasse:

.ListItemColor option
{
    color: Black; /*(default color for list item, if it is not disabled)*/
}

Dann setze die CssClass der ListBox auf diese css Klasse oben. Wenn Sie einige Listenelemente (aber nicht alle) färben möchten, müssen Sie einige Elemente formatieren und jedem seine Farbe durch Quellcode (Markup) oder Code (JavaScript, C # oder Visual Basic) zuweisen.