如何在右键单击事件中突出显示列表框项?

时间:2010-10-04 15:20:59

标签: silverlight listbox right-click

我不知道我是第一个提出这个问题的人(我搜索了整个董事会),但我从来没有找到任何答案。正如标题中所述,每当我右键单击它时,我都会尝试突出显示/选择我的列表框中的项目。

以下是XAML代码:

<ListBox Grid.Row="1" x:Name="ContactList" Margin="6" ItemsSource="{Binding ''}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <Image Source="{Binding Status_Image}" Margin="0,0,3,0" />
                <StackPanel Orientation="Vertical">
                    <TextBlock Height="20" HorizontalAlignment="Left" Text="{Binding Name}" FontWeight="Bold" FontSize="13" Foreground="Black" />
                    <TextBlock Height="20" HorizontalAlignment="Left" Text="{Binding Message}" FontSize="11" Foreground="Gray" />
                </StackPanel>
    <Image Source="{Binding NotifImg}" Margin="8,0,0,0"/>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

我知道如何处理右键单击并在按钮或单个元素上显示上下文菜单,但不在绑定的列表框上显示。如果您对我应该如何进行有任何建议,请随时告诉我,因为我目前卡住了。

谢谢你,Ephismen。

2 个答案:

答案 0 :(得分:1)

好吧,我找到了一种非常简单而干净的方式来实现我想做的事情!

以下是XAML代码:

<ListBox Grid.Row="1" x:Name="ContactList"ItemsSource="{Binding ''}" MouseRightButtonDown="ContactList_MouseRightButtonDown" MouseRightButtonUp="ContactList_MouseRightButtonUp">
     <ListBox.ItemTemplate>
         <DataTemplate>
             <StackPanel Orientation="Horizontal" >
                 <TextBlock Height="20" HorizontalAlignment="Left" Text="{Binding Name}" FontWeight="Bold" FontSize="13" Foreground="Black" />
                 <TextBlock Height="20" HorizontalAlignment="Left" Text="{Binding Message}" FontSize="11" Foreground="Gray" />
                 <Image Source="{Binding NotifImg}" Margin="8,0,0,0"/>
             </StackPanel>
         </DataTemplate>
     </ListBox.ItemTemplate>
</ListBox>

背后的代码:

    private void ContactList_MouseRightButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
    {
        e.Handled = true;
    }

    private void ContactList_MouseRightButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
    {
        VisualTreeHelper.FindElementsInHostCoordinates(e.GetPosition(null), (sender as ListBox)).OfType<ListBoxItem>().First().IsSelected = true;
    }    

不要忘记为'OfType'添加System.Linq。

Ephismen。

答案 1 :(得分:0)

多选模式解决方案

以上Ephismen的解决方案对于多选模式下的ListBox无法正常工作(例如,当Ctrl关闭时,它不会切换项目的选定状态,当Ctrl未关闭时,它不会取消选择其他项目,...)。

我建议使用自定义鼠标右键单击处理程序来创建自定义ListBoxItem。在那里,您可以模拟鼠标左键单击,从而获得完全相同的行为:

public class CustomListBoxItem : ListBoxItem
{
    protected override void OnMouseRightButtonDown(MouseButtonEventArgs e)
    {
        OnMouseLeftButtonDown(e);
    }
}

您可能还需要为ItemsSource绑定创建一个简单的转换器 - 以替换ListBoxItem

默认创建的标准CustomListBoxItem
public class ItemsToCustomListBoxItemsConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null) return null;

        return
            from object item in (IEnumerable) value
            select new CustomListBoxItem
                {
                    Content = item
                };
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new InvalidOperationException();
    }
}

以下是ItemsSource绑定的样子:

<ListBox
    ...
    ItemsSource="{Binding Converter={StaticResource ItemsToCustomListBoxItemsConverter}}"
    ...>