2010-04-23 3 views
5

Есть ли альтернативные средства контроля, которые кто-то может предложить заменить WinForms SplitContainer? Мне не нравится, как SplitContainer показывает эту странную, пунктирную полосу, когда ее выбирают, и когда ее тащит. Я хочу, чтобы панели изменялись по размеру, когда пользователь перетаскивает, а не нажимает мышь и не показывает никаких пунктирных полос при перетаскивании сплиттера. В принципе, как все изменения размеров панелей выполняются в Windows Explorer на Vista.WinForms: альтернатива SplitContainer?

Это пунктирная, что я говорю о:

splitter

ответ

8

Написать свой собственный раскол контейнера UserControl. Вы просто просто бросаете две панели на элемент управления (для левой и правой панелей), а затем пусть пространство между ними будет сплиттером. Небольшая логика MouseDown, MouseMove и MouseUp в самом UserControl позволит вам легко перемещать «сплиттер» влево и вправо, и обе панели будут правильно блокировать это везде, но над разделителем, поэтому ваша логика проверки, если мышь, если над сплиттер так же просто, как может быть.

Возможно, потребуется немного дополнительной работы, чтобы получить контроль над тем, как вы хотите, чтобы он действовал в режиме разработки.

+0

Ну я даю это попробовать, однако, с событием MouseMove по контролю, то событие перестанет стрелять, если мышь перемещается слишком быстро и проходит через одну из панелей. Есть ли способ сделать события перемещения мыши пузырьками до элемента управления или удержать контроль над всеми событиями перемещения мыши? – Telanor

+0

Nevermind, я просто подключил события MouseMove всех элементов управления к одной и той же функции. Это хорошо сработало – Telanor

+0

Мне следовало бы уточнить, что помимо обработки событий мыши вы также нуждаетесь в bool или что-то, что нужно сохранить, если кнопка мыши в данный момент отсутствует или нет (как в ответе Ганса). Если вы нажмете и удерживаете кнопку мыши на элементе управления, он будет генерировать событие MouseDown для этого элемента управления. Если вы держите кнопку мыши нажатой и перетаскиваете влево или вправо (или вверх или вниз, если на то пошло), события MouseMove будут генерироваться с помощью элемента управления, который вы нажали, даже если курсор мыши отключен от исходного элемента управления и на другом или родительская форма. – MusiGenesis

1

Вы не можете возиться с SplitContainer вообще. Одна из возможностей - полностью исключить его, если вы используете его только для изменения размера элемента управления. Вместо этого вы могли бы использовать события мыши на самом элементе управления. Отбросьте TreeView на форму и прикрепите ее слева. Подписаться на MouseDown/Переместить/Up события и написать что-то вроде этого:

bool mDragging; 

    private bool onTreeEdge(Point pos) { 
     return pos.X >= treeView1.DisplayRectangle.Right - 3; 
    } 
    private void treeView1_MouseMove(object sender, MouseEventArgs e) { 
     treeView1.Cursor = mDragging || onTreeEdge(e.Location) ? Cursors.VSplit : Cursors.Default; 
     if (mDragging) treeView1.Width = e.X; 
    } 
    private void treeView1_MouseDown(object sender, MouseEventArgs e) { 
     mDragging = onTreeEdge(e.Location); 
     if (mDragging) treeView1.Capture = true; 
    } 
    private void treeView1_MouseUp(object sender, MouseEventArgs e) { 
     mDragging = false; 
    } 
5

Я нашел это после того, как я увидел ваш вопрос, так думал, что я хотел бы поделиться: SplitContainer FAQ

Второе звено там говорит точно что тебе необходимо сделать.

Вот текст этого на всякий случай, когда связь когда-либо умирает.

//1. Use the custom control defined in the SplitContainerNoFocus sample 
//2. Insert the following code in your project, and attach these events to all of the SplitContainers that you don't want stealing focus. 

// Temp variable to store a previously focused control 
private Control focused = null; 

private void splitContainer_MouseDown(object sender, MouseEventArgs e) 
{ 
    // Get the focused control before the splitter is focused 
    focused = getFocused(this.Controls); 
} 

private Control getFocused(Control.ControlCollection controls) 
{ 
    foreach (Control c in controls) 
    { 
     if (c.Focused) 
     { 
     // Return the focused control 
     return c; 
     } 
     else if (c.ContainsFocus) 
     { 
     // If the focus is contained inside a control's children 
     // return the child 
     return getFocused(c.Controls); 
     } 
    } 
    // No control on the form has focus 
    return null; 
} 

private void splitContainer_MouseUp(object sender, MouseEventArgs e) 
{ 
    // If a previous control had focus 
    if (focused != null) 
    { 
     // Return focus and clear the temp variable for 
     // garbage collection 
     focused.Focus(); 
     focused = null; 
    } 
} 
+2

Ссылка мертва, [здесь версия зомби] (http://web.archive.org/web/20111122002109/http://windowsclient.net/blogs/faqs/archive/tags/SplitContainer/default.aspx). –

1

мне нужно было то же самое и установить следующие свойства:

 splitContainer1.Anchor = (AnchorStyles.Top | AnchorStyles.Left); 
     splitContainer1.Dock = DockStyle.Fill; 
     splitContainer1.IsSplitterFixed = true; 

Надеется, что это помогает.

-1

Кроме того, обратите внимание на компонент раскол контейнера, который поставляется с бесплатным Krypton toolkit

+0

Ссылка мертва. – Krythic

Смежные вопросы