15

アイテムのリストを表示し、どちらが「現在の」アイテムであるかを示すシナリオがあります(小さな矢印マーカーまたは変更された背景色を使用)。

「SelectedItem」のコンテキストが必要なため、ItemsControlは適切ではありません。ただし、選択範囲をプログラムで移動し、ユーザーが変更できないようにする必要があります。

ListBoxを非インタラクティブにする簡単な方法はありますか?マウスとキーボードのイベントを意図的に飲み込むことでそれを曖昧にすることはできますが、私たちが望むものを与えるいくつかの基本的なプロパティ(「IsEnabled」をその視覚スタイルに影響を与えずにfalseに設定するなど)が欠けていますか?

または...両方の長所を備えた別のWPFコントロール(SelectedItemプロパティを持つItemsControl)はありますか?

4

4 に答える 4

19

1 つのオプションは、次のように設定ListBoxItem.IsEnabledすることfalseです。

<ListBox x:Name="_listBox">
    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Setter Property="IsEnabled" Value="False"/>
        </Style>
    </ListBox.ItemContainerStyle>
</ListBox>

これにより、アイテムを選択できなくなりますが、希望どおりにレンダリングされない場合があります。これを修正するために、トリガーやテンプレートをいじることができます。例えば:

<ListBox x:Name="_listBox">
    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Setter Property="IsEnabled" Value="False"/>
            <Style.Triggers>
                <Trigger Property="IsEnabled" Value="False">
                    <Setter Property="Foreground" Value="Red" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </ListBox.ItemContainerStyle>
</ListBox>
于 2008-10-02T08:35:28.053 に答える
3

同じ問題がありました。IsEnabled を true に設定したままにして、ListBox の PreviewMouseDown イベントを処理することで解決しました。編集したくない場合は、ハンドラーで e.Handled を true に設定します。

    private void lstSMTs_PreviewMouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
    {
        e.Handled = !editRights;
    }
于 2011-02-08T22:31:08.627 に答える
1

あなたの ItemsControl/ListBox はデータバインドされていますか?

ソース データのプロパティにバインドされた各アイテムの背景ブラシを作成するか、コンバーターを介してプロパティを渡すことができると考えています。何かのようなもの:

  <ItemsControl DataContext="{Binding Source={StaticResource Things}}" ItemsSource="{Binding}" Margin="0">
    <ItemsControl.Resources>
      <local:SelectedConverter x:Key="conv"/>
    </ItemsControl.Resources>
    <ItemsControl.ItemsPanel>
      <ItemsPanelTemplate>
        <local:Control Background="{Binding Path=IsSelected, Converter={StaticResource conv}}"/>
      </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
于 2008-10-02T07:42:12.207 に答える