Усиленные вложенные элементы управления WinForms изменяет размер ошибки ядра - панели Spliter не масштабируют элементы управления должным образом

79
5

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

У меня есть некоторые формы, в которых есть элементы управления вкладками, которые не могут правильно изменить размер изображения во время загрузки. https://support.microsoft.com/en-us/kb/953934 описывает такую ошибку ядра в 2008 году. Трудно поверить, что она не была исправлена. Я думаю, что это ушло на некоторое время, но я снова начинаю видеть проблемы.

Элементы управления вложены довольно глубоко. Midi Parent, дочерняя форма, управление вкладками, управление сплиттерами с двумя панелями и элементами управления. Для верхней части первого элемента управления проблема связана с элементом управления вкладкой. Он изменяется при изменении размера формы после загрузки, но анкеры неверны, а часть элемента управления обрезана.

Проблема, похоже, специфична для 100% размера шрифта для рабочего стола - рабочие столы с размером 100+ работают нормально. Я развиваюсь на 125%, используя VS 2013 v5 - вопрос присутствовал и на v4.

Кто-нибудь знает о работе вокруг пользовательского элемента управления, как указано в статье в KB?

Что-то еще происходит, я пропустил?

Если посмотреть на нее более близко, то SplitContainer - это элемент управления, который не изменяет размер/соблюдает привязки.

Я попытался запустить этот код после того, как вкладка была показана, и это не сработало - выглядит примерно так же, как с помощью якорей. Кажется, что TabControl сообщает о некорректном ClientSize

    SplitContainer1.Width = TabControl1.ClientSize.Width - 10
SplitContainer1.Height = TabControl1.ClientSize.Height - TabControl1.ItemSize.Height - 10

Вот полная форма, которая показывает проблему. На рабочем столе на 125% он отображается так же, как и в среде IDE на 100% рабочем столе, элементы управления на вкладке расположены неправильно.

<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class frmChild
Inherits System.Windows.Forms.Form

'Form overrides dispose to clean up the component list.
<System.Diagnostics.DebuggerNonUserCode()> _
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
Try
If disposing AndAlso components IsNot Nothing Then
components.Dispose()
End If
Finally
MyBase.Dispose(disposing)
End Try
End Sub

'Required by the Windows Form Designer
Private components As System.ComponentModel.IContainer

'NOTE: The following procedure is required by the Windows Form Designer
'It can be modified using the Windows Form Designer.
'Do not modify it using the code editor.
<System.Diagnostics.DebuggerStepThrough()> _
Private Sub InitializeComponent()
Me.TabControl1 = New System.Windows.Forms.TabControl()
Me.TabPage1 = New System.Windows.Forms.TabPage()
Me.SplitContainer1 = New System.Windows.Forms.SplitContainer()
Me.Button1 = New System.Windows.Forms.Button()
Me.TabPage2 = New System.Windows.Forms.TabPage()
Me.TextBox1 = New System.Windows.Forms.TextBox()
Me.Button2 = New System.Windows.Forms.Button()
Me.TabControl1.SuspendLayout()
Me.TabPage1.SuspendLayout()
CType(Me.SplitContainer1, System.ComponentModel.ISupportInitialize).BeginInit()
Me.SplitContainer1.Panel1.SuspendLayout()
Me.SplitContainer1.Panel2.SuspendLayout()
Me.SplitContainer1.SuspendLayout()
Me.SuspendLayout()
'
'TabControl1
'
Me.TabControl1.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _
Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.TabControl1.Controls.Add(Me.TabPage1)
Me.TabControl1.Controls.Add(Me.TabPage2)
Me.TabControl1.Location = New System.Drawing.Point(82, 2)
Me.TabControl1.Name = "TabControl1"
Me.TabControl1.SelectedIndex = 0
Me.TabControl1.Size = New System.Drawing.Size(466, 436)
Me.TabControl1.TabIndex = 2
'
'TabPage1
'
Me.TabPage1.Controls.Add(Me.SplitContainer1)
Me.TabPage1.Location = New System.Drawing.Point(4, 25)
Me.TabPage1.Name = "TabPage1"
Me.TabPage1.Padding = New System.Windows.Forms.Padding(3)
Me.TabPage1.Size = New System.Drawing.Size(458, 407)
Me.TabPage1.TabIndex = 0
Me.TabPage1.Text = "TabPage1"
Me.TabPage1.UseVisualStyleBackColor = True
'
'SplitContainer1
'
Me.SplitContainer1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
Me.SplitContainer1.Dock = System.Windows.Forms.DockStyle.Fill
Me.SplitContainer1.Location = New System.Drawing.Point(3, 3)
Me.SplitContainer1.Name = "SplitContainer1"
Me.SplitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal
'
'SplitContainer1.Panel1
'
Me.SplitContainer1.Panel1.Controls.Add(Me.Button2)
Me.SplitContainer1.Panel1.Controls.Add(Me.TextBox1)
'
'SplitContainer1.Panel2
'
Me.SplitContainer1.Panel2.Controls.Add(Me.Button1)
Me.SplitContainer1.Size = New System.Drawing.Size(452, 401)
Me.SplitContainer1.SplitterDistance = 223
Me.SplitContainer1.TabIndex = 0
'
'Button1
'
Me.Button1.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.Button1.Location = New System.Drawing.Point(371, 146)
Me.Button1.Name = "Button1"
Me.Button1.Size = New System.Drawing.Size(75, 23)
Me.Button1.TabIndex = 0
Me.Button1.Text = "Button1"
Me.Button1.UseVisualStyleBackColor = True
'
'TabPage2
'
Me.TabPage2.Location = New System.Drawing.Point(4, 25)
Me.TabPage2.Name = "TabPage2"
Me.TabPage2.Padding = New System.Windows.Forms.Padding(3)
Me.TabPage2.Size = New System.Drawing.Size(854, 450)
Me.TabPage2.TabIndex = 1
Me.TabPage2.Text = "TabPage2"
Me.TabPage2.UseVisualStyleBackColor = True
'
'TextBox1
'
Me.TextBox1.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _
Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.TextBox1.BackColor = System.Drawing.SystemColors.Info
Me.TextBox1.Location = New System.Drawing.Point(17, 13)
Me.TextBox1.Multiline = True
Me.TextBox1.Name = "TextBox1"
Me.TextBox1.ScrollBars = System.Windows.Forms.ScrollBars.Vertical
Me.TextBox1.Size = New System.Drawing.Size(344, 177)
Me.TextBox1.TabIndex = 0
'
'Button2
'
Me.Button2.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.Button2.Location = New System.Drawing.Point(371, 195)
Me.Button2.Name = "Button2"
Me.Button2.Size = New System.Drawing.Size(75, 23)
Me.Button2.TabIndex = 1
Me.Button2.Text = "Button2"
Me.Button2.UseVisualStyleBackColor = True
'
'frmChild
'
Me.AutoScaleDimensions = New System.Drawing.SizeF(120.0!, 120.0!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi
Me.ClientSize = New System.Drawing.Size(548, 439)
Me.Controls.Add(Me.TabControl1)
Me.Name = "frmChild"
Me.Text = "frmChild"
Me.TabControl1.ResumeLayout(False)
Me.TabPage1.ResumeLayout(False)
Me.SplitContainer1.Panel1.ResumeLayout(False)
Me.SplitContainer1.Panel1.PerformLayout()
Me.SplitContainer1.Panel2.ResumeLayout(False)
CType(Me.SplitContainer1, System.ComponentModel.ISupportInitialize).EndInit()
Me.SplitContainer1.ResumeLayout(False)
Me.ResumeLayout(False)

End Sub
Friend WithEvents TabControl1 As System.Windows.Forms.TabControl
Friend WithEvents TabPage1 As System.Windows.Forms.TabPage
Friend WithEvents SplitContainer1 As System.Windows.Forms.SplitContainer
Friend WithEvents Button1 As System.Windows.Forms.Button
Friend WithEvents TabPage2 As System.Windows.Forms.TabPage
Friend WithEvents Button2 As System.Windows.Forms.Button
Friend WithEvents TextBox1 As System.Windows.Forms.TextBox
End Class

спросил(а) 2015-07-28T19:47:00+03:00 5 лет, 1 месяц назад
1
Решение
58

Если SplitPanel не SplitPanel свое содержимое правильно, вы можете попробовать помещать содержимое в другой контейнер, который менее глючит.

Попробуйте положить TableLayoutPanel внутри SplitPanel. Установите TableLayoutPanel.Dock свойство Fill, а затем .Anchor ваши управления внутри этого. (Не используйте .Dock внутри TableLayoutPanel, это немного flaky).

Элементы управления внутри TableLayoutPanel будут иметь новые свойства, называемые .RowSpan и .ColumnSpan которые позволяют элементам управления охватывать несколько ячеек.

В правом верхнем углу TableLayoutPanel есть небольшая стрелка, которая позволит вам редактировать строки и столбцы. Я считаю, что лучше всего сделать максимально возможную фиксированную ширину/высоту, а затем использовать процент для остальных. Я не использую Autosize но вы можете попробовать это.

ответил(а) 2015-07-29T04:16:00+03:00 5 лет, 1 месяц назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема