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