0

我用 ListBoxItems 创建了一个 ListBox,并向每个 ListBoxItems 添加了一个 MouseDown 事件处理程序。显示了 ListBoxItems,但是当我单击 ListBoxItem 时,该事件不会被触发。

我如何设置 MouseUp:

TrackedProcessList.ItemsSource = null;
TrackedProcessList.ItemsSource = this.tracks;

/*... some other code that doesn't matter ... */

ListBoxItem[] items = new ListBoxItem[TrackedProcessList.Items.Count];
for (int i = 0; i < TrackedProcessList.Items.Count; i++)
{
    Object obj = TrackedProcessList.Items.GetItemAt(i);
    //TrackedProcessList.UpdateLayout();
    ListBoxItem item = (ListBoxItem)(TrackedProcessList.ItemContainerGenerator.ContainerFromIndex(i));
    if (item != null) 
    {
        item.MouseUp += new MouseButtonEventHandler(ListBoxItem_MouseUp_PostQuestion);
        items[i] = item;
    }
}

应该调用的方法(但不是):

private void ListBoxItem_MouseUp_PostQuestion(object sender, EventArgs e)
{
    MessageBox.Show("ListBoxItem_MouseUp_fired");
}

我的 XAML:

<ListBox x:Name="TrackedProcessList" Height="145" Width="605" ItemsSource="{Binding}" BorderThickness="1,0" IsSynchronizedWithCurrentItem="True">
    <DataTemplate>
        <TextBlock  MouseDown="ListBoxItem_MouseUp_PostQuestion" Text="{Binding Path=programName}" HorizontalAlignment="Stretch" ></TextBlock>
    </DataTemplate>
</ListBox>

你有什么想法可能失败吗?没有错误。事件似乎没有绑定到 ListBoxItem。

4

3 回答 3

2

这是因为ListBoxItem已经处理了左右单击,这意味着您的事件处理程序不会根据 WPF 路由事件规则触发。您必须为已处理的事件分配PreviewMouseDown事件或添加事件处理程序:

lbi.AddHandler(ListBoxItem.MouseDownEvent, new MouseButtonEventHandler(MouseEvent), true);
于 2013-05-27T11:44:43.067 回答
0
void OnListBox_Mouse_Down(object sender, MouseButtonEventArgs e)
{
   e.Handled
}

void OnListBox_Mouse_Up(object sender, MouseButtonEventArgs e)
{
   "Do Something";
}
于 2013-07-21T19:54:03.197 回答
0

使用 ContainedControl 属性并设置您的事件:)

kryptonListBox1.ContainedControl.MouseDown += kryptonListBox1_MouseDown_1;
于 2017-05-07T08:39:08.527 回答