WinForms: альтернатива SplitContainer?

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

Это - точечная вещь, о которой я говорю:

splitter
(источник: bhslaughter.com)

6
задан Glorfindel 24 July 2019 в 05:30
поделиться

4 ответа

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

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

9
ответ дан 8 December 2019 в 14:41
поделиться

Вы вообще не можете повозиться со 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;
    }
1
ответ дан 8 December 2019 в 14:41
поделиться

Я нашел это после того, как увидел ваш вопрос, поэтому решил поделиться: 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;
   }
}
6
ответ дан 8 December 2019 в 14:41
поделиться

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

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

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

1
ответ дан 8 December 2019 в 14:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: