代码之家  ›  专栏  ›  技术社区  ›  Pygmy

Listbox datatemplate-仅通过单击子元素而不是项目上的任何位置来选择项目

  •  8
  • Pygmy  · 技术社区  · 14 年前

    我有一个列表框,其中包含项目的数据模板。 问题是,仅仅单击项目上的任意位置来选择项目是行不通的;我必须单击特定的子元素,它才能真正起作用。

    我的项目有一个图像和一个文本块。 如果将鼠标悬停在项目的任何“空”空间上,则没有悬停效果(单击此处时也没有选择)。

    示例图像: http://i33.tinypic.com/wvtleg.png

    如果我点击(或将鼠标悬停在)实际文本或图像,它就可以正常工作, 但是如果我将鼠标悬停在空白区域(我在它周围画了一条红线:),列表框就不会响应。

    如何使列表框悬停/单击以响应单击 在任何地方 在物品的空间里?

    <ListBox Grid.Row="1"
      ItemsSource="{Binding Path=CreatableOutputWindows, Mode=OneWay}" Height="Auto"
      HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
      Margin="8,8,8,8"
      Name="listBox1" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch">
      <ListBox.ItemTemplate>
        <DataTemplate>
          <Grid>
            <Grid.ColumnDefinitions>
              <ColumnDefinition Width="84"/>
              <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <Border Margin="5" BorderBrush="Black" BorderThickness="2">
              <Image Source="{Binding Path=Image}" Stretch="Fill" Width="80" Height="50" />
            </Border>
            <StackPanel Grid.Column="1" Margin="5">
              <StackPanel Orientation="Horizontal" TextBlock.FontWeight="Bold">
                <TextBlock Text="{Binding Path=Name}" />
              </StackPanel>
            </StackPanel>
          </Grid>
        </DataTemplate>
      </ListBox.ItemTemplate>
    </ListBox>
    
    2 回复  |  直到 14 年前
        1
  •  8
  •   Goblin    14 年前

    正如Quartermeister所指出的,您需要设置网格的背景,但是您还需要在资源中设置以下样式,因为ListBoxItems的HorizontalContentAlignment默认设置为Left。(仅在列表框中设置是不够的)

    <ListBox.Resources>
        <Style TargetType="{x:Type ListBoxItem}">
            <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
        </Style>
    </ListBox.Resources>
    
        2
  •  15
  •   Quartermeister    14 年前

    听起来您的ListBoxItem没有响应 hit testing . 尝试将网格的背景设置为透明:

    <Grid Background="Transparent">
    

    默认值为null,这将使元素对命中测试不可见。将背景设置为“透明”不会影响显示,但会允许命中元素。ListBoxItem的默认样式将有一个透明的背景,但您可能已经重新设置了样式。