Mam nadzieję, że już otrzymałeś odpowiedź.
Mam rozwiązanie na własną rękę.
Więc moje wymóg:
mam okienko niestandardowy, który zawiera listbox, każdy element jest normalny ciąg. Kiedy przeciągam element z pola listy do dokumentu, w określonej lokalizacji, chcę wstawić pole scalania w tej lokalizacji. Nazwa pola scalania jest tekstem pozycji.
Z początku było to proste, wtedy dostałem problem, jak opisałeś w swoim pytaniu.
o kodzie
Tak, tam jest pole listy, trzeba obsłużyć mouseDown i mouseMove, nie martw się o mouseUp.
W procedurze obsługi myszki, zapisuję granicę, jeśli mysz zostanie przesunięta poza tę granicę, rozpocznie się przeciąganie.
Następnie, w listBox_MouseMoveHandler, sprawdzam pozycję myszy, aby uruchomić przeciągnięcie. I muszę użyć metody DragDropEffects.Copy
dla metody DoDragDrop
.
DoDragDrop((sender as ListControl).SelectedValue, DragDropEffects.Copy);
Dzięki tej możliwości, SelectedValue zostanie wstawiony w miejscu zrzutu, a po włożeniu zostanie ona również wybrana.
Następnie, po prostu sprawdzam, czy zaznaczenie nie jest puste, i zamień zaznaczony tekst na pole scalania. Oczywiście zawaliłem selekcję przed DoDragDrop
. I to jest cała sztuczka.
private int _selectedItemIndex;
private Rectangle dragBoxFromMouseDown;
private void CustomizationForListBox(ListBox listBox)
{
listBox.ItemHeight = 25;
listBox.DrawMode = DrawMode.OwnerDrawFixed;
listBox.DrawItem += ListBox_DrawItem;
listBox.MouseDoubleClick += listBox_MouseDoubleClick;
listBox.MouseMove += listBox_MouseMoveHandler;
listBox.MouseUp += listBox_MouseUp;
listBox.MouseDown += (sender, e) =>
{
// Handle drag/drop
if (e.Button == MouseButtons.Left)
{
_selectedItemIndex = listBox.IndexFromPoint(e.Location);
// Remember the point where the mouse down occurred. The DragSize indicates
// the size that the mouse can move before a drag event should be started.
Size dragSize = SystemInformation.DragSize;
// Create a rectangle using the DragSize, with the mouse position being
// at the center of the rectangle.
dragBoxFromMouseDown = new Rectangle(new Point(e.X - (dragSize.Width/2),
e.Y - (dragSize.Height/2)), dragSize);
}
};
}
private void listBox_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
// Reset the drag rectangle when the mouse button is raised.
dragBoxFromMouseDown = Rectangle.Empty;
}
}
private void listBox_MouseMoveHandler(object sender, MouseEventArgs e)
{
// Handle drag and drop
// To check if the Mouse left button is clicked
if ((e.Button & MouseButtons.Left) == MouseButtons.Left)
{
// If the mouse moves outside the rectangle, start the drag.
if (dragBoxFromMouseDown != Rectangle.Empty &&
!dragBoxFromMouseDown.Contains(e.X, e.Y))
{
// Collapse current selection, now we know nothing is selected
Globals.ThisAddIn.Application.Selection.Collapse(WdCollapseDirection.wdCollapseEnd);
//Start Drag Drop
DoDragDrop((sender as ListControl).SelectedValue, DragDropEffects.Copy);
if (_selectedItemIndex != -1)
{
// If the drag/drop was successful, there dropped text must be selected
if (!String.IsNullOrWhiteSpace(Globals.ThisAddIn.Application.Selection.Text))
{
// Replace the selected text with a merge field MergeFieldHelper.InsertSingleMergeField(mergeFieldInfos[_selectedItemIndex].Name); } } } } }
Masz jeszcze odpowiedź? – vothaison