9 Stimmen

WPF: ListBox deaktivieren, aber Scrollen aktivieren

Ich habe mir den ganzen Morgen den Kopf darüber zerbrochen.

Im Grunde habe ich eine Listbox, und ich möchte verhindern, dass die Benutzer die Auswahl während eines langen laufenden Prozesses ändern, aber es ihnen ermöglichen, immer noch zu blättern.

Lösung:

Alle Antworten waren gut, ich ging mit schlucken Maus-Ereignisse, da das die meisten straight forward war. Ich verdrahtet PreviewMouseDown und PreviewMouseUp auf ein einzelnes Ereignis, das meine backgroundWorker.IsBusy überprüft, und wenn es die IsHandled-Eigenschaft auf die Ereignis-Args auf wahr gesetzt wurde.

1voto

Ivan Milijic Punkte 51

Das hat bei mir am besten funktioniert. Es ist einfach und ganzen Code ist in XAML, die IMO sehr ordentlich ist.

<ListBox ItemsSource="{Binding MySource}">
  <ListBox.ItemContainerStyle>
    <Style TargetType="ListBoxItem">
      <Style.Triggers>
        <DataTrigger Binding="{Binding IsEditing}" Value="True">
          <Setter Property="IsEnabled" Value="True"/>
        </DataTrigger>
        <DataTrigger Binding="{Binding IsEditing}" Value="False">
          <Setter Property="IsEnabled" Value="False"/>
        </DataTrigger>
      </Style.Triggers>
    </Style>
  </ListBox.ItemContainerStyle>  
</ListBox>

0voto

Caleb Vear Punkte 2597

Eine weitere erwägenswerte Option ist die Deaktivierung der ListBoxItems. Dies kann durch Einstellen des ItemContainerStyle wie im folgenden Schnipsel gezeigt erfolgen.

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

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

Diese Frage ist so ziemlich die gleiche wie diese: Es gibt keine ListBox.SelectionMode="None", gibt es eine andere Möglichkeit, die Auswahl in einer Listbox zu deaktivieren? und meine Antwort ist dieselbe.

0voto

Asad Durrani Punkte 2147

Ich habe eine sehr einfache und geradlinige Lösung gefunden, die bei mir funktioniert. Ich hoffe, sie funktioniert auch bei Ihnen

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

0voto

Chris Klepeis Punkte 9464

Eine vollständige Antwort mit http://www.codeproject.com/Tips/60619/Scrollable-Disabled-ListBox-in-WPF

Der Stil:

<Style TargetType="{x:Type local:CustomListBox}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:CustomListBox}">
                <Border SnapsToDevicePixels="true" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="1">
                    <ScrollViewer IsEnabled="True">
                        <ItemsPresenter IsEnabled="{Binding Path=IsEnabledWithScroll,  RelativeSource={RelativeSource TemplatedParent}}"  SnapsToDevicePixels="{TemplateBinding  UIElement.SnapsToDevicePixels}"/>
                    </ScrollViewer>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Die Klasse

public class CustomListBox : ListBox
{
    public bool IsEnabledWithScroll
    {
        get { return (bool)GetValue(IsEnabledWithScrollProperty); }
        set { SetValue(IsEnabledWithScrollProperty, value); }
    }

    public static readonly DependencyProperty IsEnabledWithScrollProperty =
        DependencyProperty.Register("IsEnabledWithScroll", typeof(bool), typeof(CustomListBox), new UIPropertyMetadata(true));
}

Anstatt IsEnabled für die ListBox zu setzen, verwenden Sie IsEnabledWithScroll. Der Bildlauf wird funktionieren, wenn die Listbox aktiviert oder deaktiviert ist.

0voto

Mageician Punkte 2879

Es scheint viele Möglichkeiten zu geben, diese spezielle Katze zu häuten. Ich fand heraus, dass die Einstellung IsHitTestVisible über die ItemsContainerStyle in XAML bekam ich genau das, was ich brauchte:

<ListBox IsHitTestVisible="true" ScrollViewer.VerticalScrollBarVisibility="Auto" ScrollViewer.CanContentScroll="True">
    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Setter Property="IsHitTestVisible" Value="False" />
        </Style>
    </ListBox.ItemContainerStyle>
</ListBox>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X