如何使WPF列表框项不可单击

时间:2014-01-06 20:15:06

标签: c# .net wpf mvvm .net-4.0

我正在使用列表框显示我在语音激活程序中以编程方式选择的项目列表。有没有办法阻止所选项目被点击?我确实希望将鼠标悬停在功能上,而不是点击实际项目。

我试图设置Focusable(不做我想要的任何事情)和IsEnabled(禁用鼠标悬停)

这是我目前的风格:

<Style x:Key="GlyphList" TargetType="ListBox">
    <Setter Property="ItemsPanel">
      <Setter.Value>
        <ItemsPanelTemplate>
          <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" IsEnabled="False"/>
        </ItemsPanelTemplate>
      </Setter.Value>
    </Setter>
    <Setter Property="ItemTemplate">
      <Setter.Value>
        <DataTemplate DataType="models:SpellingGlyph">
          <Label VerticalAlignment="Bottom">
            <Label.Template>
              <ControlTemplate>
                <Grid>
                  <TextBlock Name="MainText" Text="{Binding Text}" VerticalAlignment="Bottom" Margin="0,0,5,0"/>
                </Grid>
                <ControlTemplate.Triggers>
                  <DataTrigger Value="True">
                    <DataTrigger.Binding>
                      <MultiBinding Converter="{StaticResource ObjectReferenceEqualityConverter}">
                        <Binding />
                        <Binding Path="SelectedItem" RelativeSource="{RelativeSource FindAncestor, AncestorType=ListBox}"/>
                      </MultiBinding>
                    </DataTrigger.Binding>
                    <Setter TargetName="MainText" Property="Foreground" Value="#75BAFF"/>
                    <Setter TargetName="MainText" Property="FontWeight" Value="SemiBold"/>
                    <Setter TargetName="MainText" Property="FontSize" Value="22"/>
                  </DataTrigger>
                  <DataTrigger Value="True">
                    <DataTrigger.Binding>
                      <MultiBinding Converter="{StaticResource MultiBooleanConverter}"> <!--SelectedItem trumps mouse over-->
                        <Binding ElementName="MainText" Path="IsMouseOver"/>
                        <Binding Path="SelectedItem" RelativeSource="{RelativeSource FindAncestor, AncestorType=ListBox}" Converter="{StaticResource InvertedNullCheckToBooleanConverter}"/>
                      </MultiBinding>
                    </DataTrigger.Binding>
                    <Setter TargetName="MainText" Property="Foreground" Value="#75BAFF"/>
                    <Setter TargetName="MainText" Property="FontWeight" Value="SemiBold"/>
                    <Setter TargetName="MainText" Property="FontSize" Value="22"/>
                  </DataTrigger>
                </ControlTemplate.Triggers>
              </ControlTemplate>
            </Label.Template>
          </Label>
        </DataTemplate>
      </Setter.Value>
    </Setter>
  </Style>

3 个答案:

答案 0 :(得分:1)

<ListBox PreviewMouseDown="ListBox_OnPreviewMouseDown"..

private void ListBox_OnPreviewMouseDown(object sender, MouseButtonEventArgs e)
{
    e.Handled = true;
}

答案 1 :(得分:0)

我接受的另一种解决方案是在我的视图模型中添加以下内容:

     if (_viewModelSetSelectedGlyph != value) return;
    _selectedGlyph = value;
    OnPropertyChanged("SelectedGlyph");

然后,在实际设置_viewModelSetSelectedGlyph之前,每次都设置SelectedGlyph。然后,当UI尝试设置SelectedGlyph时,它将不会成功,只有当视图模型通过设置私有变量设置它才会成功。

答案 2 :(得分:0)