WinForms: альтернатива SplitContainer? - PullRequest
6 голосов
/ 23 апреля 2010

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

Это пунктирная вещь, о которой я говорю:

splitter

Ответы [ 5 ]

9 голосов
/ 24 апреля 2010

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

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

5 голосов
/ 02 июня 2010

Я нашел это после того, как увидел ваш вопрос, поэтому подумал, что поделюсь: Часто задаваемые вопросы по SplitContainer

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

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

//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;
   }
}
1 голос
/ 23 июля 2010

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

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

Надеюсь, это поможет.

1 голос
/ 24 апреля 2010

Нельзя возиться с SplitContainer вообще. Одна возможность - полностью исключить ее, если вы используете ее только для изменения размера элемента управления. Вместо этого вы можете использовать события мыши на самом элементе управления. Перетащите TreeView на форму и закрепите его слева. Подпишитесь на события MouseDown / Move / 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;
    }
0 голосов
/ 22 августа 2011

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

...