我有一个telerik网格视图,当我右键单击标题时,我会显示一个,其中有一个包含列列表的ListBox。
项目模板被重新定义为显示一个复选框,这样我就可以设置列是否可见。我也可以拖放列来重新排序。
以下是我如何创建弹出菜单:
var view = new ColumnsOrderer.ColumnsOrderer
{
DataContext = new ColumnsOrderer.ViewModelColumnsOrderer(Columns)
};
var codePopup = new Popup
{
Child = view,
MaxHeight = 400,
StaysOpen = false,
Placement = PlacementMode.Mouse
};
codePopup.IsOpen = true;
现在一切似乎都正常工作,但事实并非如此。如果我将列设置为可见或隐藏,然后在弹出窗口外单击,它将正确关闭。
不过,如果我拖动一个项目来重新排序,弹出窗口似乎会失去焦点,如果我在弹出窗口外点击,它就不会关闭。我必须在弹出窗口内的列表框中单击返回,然后通过单击外部将其关闭。
以下是我的拖放事件:
public ColumnsOrderer()
{
InitializeComponent();
InitialiazeListBoxDragDrop();
}
private void InitialiazeListBoxDragDrop()
{
var itemContainerStyle = new Style(typeof(ListBoxItem));
itemContainerStyle.Setters.Add(new Setter(AllowDropProperty, true));
itemContainerStyle.Setters.Add(new EventSetter(PreviewMouseMoveEvent, new MouseEventHandler(OnMouseMove)));
itemContainerStyle.Setters.Add(new EventSetter(DropEvent, new DragEventHandler(OnDrop)));
listColumns.ItemContainerStyle = itemContainerStyle;
}
void OnMouseMove(object sender, MouseEventArgs e)
{
if (e.OriginalSource is CheckBox || e.LeftButton == MouseButtonState.Released)
return;
if (sender is ListBoxItem)
{
var draggedItem = sender as ListBoxItem;
draggedItem.IsSelected = true;
DragDrop.DoDragDrop(draggedItem, draggedItem.DataContext, DragDropEffects.Move);
}
}
void OnDrop(object sender, DragEventArgs e)
{
if (!(sender is ListBoxItem))
return;
}
有趣的是,如果我删除OnDrop处理程序,问题就不存在了。我尝试了很多方法将焦点设置回弹出窗口,但都不起作用。
有人能帮我吗?
在拖放操作后尝试重新聚焦Popup
控件如何?
void OnDrop(object sender, DragEventArgs e)
{
if (!(sender is ListBoxItem))
return;
codePopup.Focus();
}