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

Silverlight 如何在右键单击事件中突出显示列表框的项目?,silverlight,listbox,right-click,Silverlight,Listbox,Right Click,我不知道我是否是第一个问这个问题的人。我搜索了整个棋盘,但没有找到任何答案。正如标题中所说,每当我右键单击列表框中的某个项目时,我都会尝试高亮显示/选择该项目 以下是XAML代码: <ListBox Grid.Row="1" x:Name="ContactList" Margin="6" ItemsSource="{Binding ''}"> <ListBox.ItemTemplate> <DataTemplate>

我不知道我是否是第一个问这个问题的人。我搜索了整个棋盘,但没有找到任何答案。正如标题中所说,每当我右键单击列表框中的某个项目时,我都会尝试高亮显示/选择该项目

以下是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>
<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>
我知道如何处理右键单击,并在按钮或单个元素上显示上下文菜单,但在绑定的列表框上却没有。如果你对我应该如何进行有任何建议,请随时告诉我,因为我目前陷入困境


谢谢你,Ephismen。

好吧,我找到了一个非常简单和干净的方法来实现我想做的事情

以下是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>
<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.

多重选择模式解决方案 以上Ephismen的解决方案对于多选择模式下的列表框不起作用,例如,当按下Ctrl键时,它不会切换项目的选定状态,当按下Ctrl键时,它不会取消选择其他项目

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

public class CustomListBoxItem : ListBoxItem
{
    protected override void OnMouseRightButtonDown(MouseButtonEventArgs e)
    {
        OnMouseLeftButtonDown(e);
    }
}
您可能还需要为ItemsSource绑定创建一个简单的转换器-用CustomListBoxItem替换默认情况下创建的标准ListBoxItem:

下面是ItemsSource绑定的外观:

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

你看到这个链接了吗?虽然它确实讨论了上下文菜单,但我认为它在某些方面可能有用。是的,我看到了该链接,但它没有提供我需要的信息,因为没有人回答他的问题。我只需创建行为或触发器/操作组合,并将其附加到顶部堆栈面板。是的,但是我如何通过右键单击选择UI元素?Listbox已启用默认的LeftClick事件,但右键单击不是本机事件,因此在触发它时它不会选择任何内容。请将Listbox的SelectedItem属性设置为接收右键单击的项目