简体   繁体   English

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

[英]How to make a WPF listbox item not clickable

I am using a listbox to display a list of items that I am selecting programmatically in a voice activated program. 我正在使用一个列表框显示我在语音激活程序中以编程方式选择的项目列表。 Is there any way to keep the selected item from being clicked on? 有什么办法可以防止选中的项目被点击? I do want mouse over functionality, just not clicking on the actual item. 我确实希望将鼠标悬停在功能上,只是不要单击实际项目。

I have tried to set Focusable (does not do anything for what I want) and IsEnabled (disables mouse over) 我试图设置Focusable(对我想要的东西不执行任何操作)和IsEnabled(禁用鼠标悬停)

Here is my current style: 这是我目前的风格:

<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>
<ListBox PreviewMouseDown="ListBox_OnPreviewMouseDown"..

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

An alternative solution to what I accepted was to add the following in my view model: 我接受的替代解决方案是在视图模型中添加以下内容:

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

Then, set the _viewModelSetSelectedGlyph each time before actually setting the SelectedGlyph . 然后,在实际设置SelectedGlyph之前,每次设置_viewModelSetSelectedGlyph Then, when the UI tries to set the SelectedGlyph , it would not succeed, only when the view model sets it by also setting the private variable does it succeed. 然后,当UI尝试设置SelectedGlyph ,它不会成功,只有当视图模型通过还设置私有变量来设置它时,它才会成功。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM