I redraw the graphics of the Tab
for the TabControl
but I can’t set the Width
of it.
What I want is that the text of the Tab
and the icon is contained in its size.
Now is something like this:
My Code
private void tabControlForm_DrawItem(object sender, DrawItemEventArgs e)
{
try
{
using (Brush br = new SolidBrush(TabColors[tabControlForm.TabPages[e.Index]]))
{
Rectangle rect = e.Bounds;
rect.Width += 10;
e.Graphics.FillRectangle(br, rect);
SizeF sz = e.Graphics.MeasureString(tabControlForm.TabPages[e.Index].Text, e.Font);
e.Graphics.DrawString(tabControlForm.TabPages[e.Index].Text, e.Font, Brushes.Black, rect.Left + (rect.Width - sz.Width) / 2, rect.Top + (rect.Height - sz.Height) / 2 + 1);
using (var src = new Bitmap(System.Reflection.Assembly.GetEntryAssembly().GetManifestResourceStream("Castor.Gestionale.images.close-button.png")))
{
e.Graphics.DrawImage(src, rect.Right - 18, rect.Top + 10);
}
e.Graphics.DrawRectangle(Pens.DarkGray, rect);
e.DrawFocusRectangle();
}
}
catch {}
}
Thanks
Ian
29.8k19 gold badges69 silver badges105 bronze badges
asked Feb 2, 2016 at 13:59
Lorenzo BelfantiLorenzo Belfanti
1,1353 gold badges22 silver badges50 bronze badges
Actually you can set the size of the tabs, but not individually.
The combination of SizeMode = Fixed
and some suitable value for the TabControl.Itemsize
will create any size, but always the same..:
So for individually enlarging each tab to make the icon fit you indeed need to use Ian’s ‘spacey’ method..
answered Feb 2, 2016 at 15:27
0
Unfortunately, there isn’t built-in property to control the width of the TabPages'
tab header of the TabControl
individually (Edit: apparently, there is TabControl.ItemSize
to control it collectively. See TaW’s answer to fix the width of all tab pages under a tab control).
But a little trick you could do is to give additional spaces
in the left or in the right of the TabPage.Text
to give you enough space for your icon.
Without space:
With 7 spaces:
It should be enough to put your icon
answered Feb 2, 2016 at 14:15
IanIan
29.8k19 gold badges69 silver badges105 bronze badges
1
Try increasing «myTabControl.Padding.X». It works for me!
answered Mar 12, 2020 at 11:52
NaderNader
711 silver badge2 bronze badges
1
Use it…
private void FrmSqlMain_Load(object sender, EventArgs e)
{
myTabControl.SizeMode = TabSizeMode.Normal;
myTabControl.DrawMode = TabDrawMode.OwnerDrawFixed;
}
answered Mar 11, 2020 at 3:10
Also i would like to add one more thing. At first, I tried adding spaces but it didn’t seem like working for me. Later, I realized I had to add more spaces than usual to see the difference.
answered Apr 29, 2020 at 11:50
How can I change the border size/style/color of my TabControl
to make it blend in with my form’s background color?
I am unable to find any property for this in Visual Studio. Is this possible?
Cody Gray♦
236k50 gold badges486 silver badges567 bronze badges
asked Feb 22, 2011 at 12:05
8
The TabControl
isn’t expecting to be placed over a custom-colored background. What you’re seeing at the edges is the standard color used for 3D controls. You normally wouldn’t notice that if you hadn’t changed the background color of your form. By default, they’re the same color.
I don’t know of any good way to fix this. The TabControl
doesn’t expose an awful lot of built-in options for customizing its appearance. You’re going to have to owner draw and paint it a custom color yourself.
Visit this page for some different options and sample code. I suspect that the Completely OwnerDraw TabControl is what you need; use the code that’s provided and customize it to your liking. Be thankful someone else has already done all the work for you, because implementing this yourself is non-trivial.
Also note that changing the DrawMode
to «OwnerDrawFixed» will disable themes. Your control will look like it came straight out of Windows 95, instead of getting drawn in the Luna or Aero theme styles. Not a big deal if you’re completely customizing how it’s painted, but a pain in the rear if all you want is to change the background color.
answered Feb 22, 2011 at 12:36
Cody Gray♦Cody Gray
236k50 gold badges486 silver badges567 bronze badges
3
if you are trying to hide the borders and blend them with the form’s backcolor,
put the TabControl in a container like «Panel» control and make the size of the TabConrol bigger than the Panel control size, but this will cover the Tabs Buttons also, and for this issue you can add button for each tab and set the button’s click event to to change the TabControl’s SelectedTab property.
Note: you can keep the TabControl in a location where you can change the tab in designtime then add the small following code on form’s Load event to hide the Tabs buttons on runtime:
Private Sub Form_Load(sender As Object, e As EventArgs) Handles Me.Load
TabControl.ItemSize = New Size(0, 1)
TabControl.SizeMode = TabSizeMode.Fixed
End Sub
answered Mar 16, 2019 at 12:57
1
Me.TabPage1.BackColor = Color.Blue
Try this, it will be helpful to you.
Echilon
9,99032 gold badges133 silver badges214 bronze badges
answered Feb 22, 2011 at 12:24
Yoko ZunnaYoko Zunna
1,80414 silver badges21 bronze badges
1
10 / 10 / 7 Регистрация: 23.12.2015 Сообщений: 950 |
|
1 |
|
20.06.2018, 20:42. Показов 7546. Ответов 1
Здравствуйте. Можно ли как-то изменить размер вкладок в TabControl? А именно растянуть их по всей ширине tabControl, как это делает свойство AutoSizeColumnMode.Fill для DataGrid. А то получается, что одна вкладка больше, другая меньше, все они достаточно маленькие и выглядит это, как привет из 80-х.
__________________
0 |
Ellizio 228 / 165 / 110 Регистрация: 09.11.2015 Сообщений: 454 |
||||
21.06.2018, 00:17 |
2 |
|||
РешениеDenKG, свойство SizeMode выставляете в Fixed, затем меняете свойство ItemSize. Можно и кодом, если кол-во вкладок не фиксировано
0 |
- Remove From My Forums
-
Question
-
I’m creating a windows form in VS 2008 using C#. I’m using a tabcontrol where the tabs align left, size mode is fixed, draw mode is ownerdrawfixed, and tabs are programmatically set to display horizontally. I anchored a datagridview control in the «panel» portion of the tabcontrol, and now I’m trying to move and resize the «panel» area, but it won’t budge. Any ideas?
//Here’s the tabcontrol
this.tabControl1.Alignment = System.Windows.Forms.TabAlignment.Left;
this.tabControl1.Anchor = System.Windows.Forms.AnchorStyles.None;
this.tabControl1.Appearance = System.Windows.Forms.TabAppearance.Buttons;
this.tabControl1.Controls.Add(this.tbActivity);
this.tabControl1.DrawMode = System.Windows.Forms.TabDrawMode.OwnerDrawFixed;
this.tabControl1.ItemSize = new System.Drawing.Size(25, 220);
this.tabControl1.Location = new System.Drawing.Point(5, 12);
this.tabControl1.Margin = new System.Windows.Forms.Padding(0);
this.tabControl1.Multiline = true;
this.tabControl1.Name = «tabControl1»;
this.tabControl1.Padding = new System.Drawing.Point(0, 0);
this.tabControl1.SelectedIndex = 0;
this.tabControl1.Size = new System.Drawing.Size(985, 542);
this.tabControl1.SizeMode = System.Windows.Forms.TabSizeMode.Fixed;
this.tabControl1.TabIndex = 0;//Here’s the first tab
this.tbActivity.Controls.Add(this.dataGridView1);
this.tbActivity.Location = new System.Drawing.Point(393, 4);
this.tbActivity.Margin = new System.Windows.Forms.Padding(0);
this.tbActivity.Name = «tbActivity»;
this.tbActivity.Size = new System.Drawing.Size(588, 534);
this.tbActivity.TabIndex = 0;
this.tbActivity.Text = «Activity»;
this.tbActivity.UseVisualStyleBackColor = true;//Here’s the datagridview
this.dataGridView1.AllowUserToAddRows = false;
this.dataGridView1.AllowUserToDeleteRows = false;
this.dataGridView1.AutoGenerateColumns = false;
this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.dataGridView1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
this.fiscyearDataGridViewTextBoxColumn,
this.activityDataGridViewTextBoxColumn,
this.activitynmDataGridViewTextBoxColumn,
this.activityextendednameDataGridViewTextBoxColumn});
this.dataGridView1.DataSource = this.activityExtendedNameBindingSource;
this.dataGridView1.GridColor = System.Drawing.SystemColors.Control;
this.dataGridView1.Location = new System.Drawing.Point(10, 3);
this.dataGridView1.Margin = new System.Windows.Forms.Padding(0);
this.dataGridView1.Name = «dataGridView1»;
this.dataGridView1.RowHeadersWidth = 40;
this.dataGridView1.Size = new System.Drawing.Size(545, 472);
this.dataGridView1.TabIndex = 0;
Answers
-
Hi,
Do you mean you want to move or resize the tabControl?
Base on my understanding, you can set the size and location property of tabcontrol to resize and move.
There is another thread about resize tab control. You can dock the tabcontrol to the form.How to resize tab control?
If I misunderstood you, or you have other questions, please feel free to tell me.
Best regards,
Ling Wang
Please remember to click “Mark as Answer” on the post that helps you, and to click “Unmark as Answer” if a marked post does not actually answer your question. This can be beneficial to other community members reading the thread.
-
Marked as answer by
Friday, April 3, 2009 12:07 PM
-
Marked as answer by
- Remove From My Forums
-
Question
-
I’m creating a windows form in VS 2008 using C#. I’m using a tabcontrol where the tabs align left, size mode is fixed, draw mode is ownerdrawfixed, and tabs are programmatically set to display horizontally. I anchored a datagridview control in the «panel» portion of the tabcontrol, and now I’m trying to move and resize the «panel» area, but it won’t budge. Any ideas?
//Here’s the tabcontrol
this.tabControl1.Alignment = System.Windows.Forms.TabAlignment.Left;
this.tabControl1.Anchor = System.Windows.Forms.AnchorStyles.None;
this.tabControl1.Appearance = System.Windows.Forms.TabAppearance.Buttons;
this.tabControl1.Controls.Add(this.tbActivity);
this.tabControl1.DrawMode = System.Windows.Forms.TabDrawMode.OwnerDrawFixed;
this.tabControl1.ItemSize = new System.Drawing.Size(25, 220);
this.tabControl1.Location = new System.Drawing.Point(5, 12);
this.tabControl1.Margin = new System.Windows.Forms.Padding(0);
this.tabControl1.Multiline = true;
this.tabControl1.Name = «tabControl1»;
this.tabControl1.Padding = new System.Drawing.Point(0, 0);
this.tabControl1.SelectedIndex = 0;
this.tabControl1.Size = new System.Drawing.Size(985, 542);
this.tabControl1.SizeMode = System.Windows.Forms.TabSizeMode.Fixed;
this.tabControl1.TabIndex = 0;//Here’s the first tab
this.tbActivity.Controls.Add(this.dataGridView1);
this.tbActivity.Location = new System.Drawing.Point(393, 4);
this.tbActivity.Margin = new System.Windows.Forms.Padding(0);
this.tbActivity.Name = «tbActivity»;
this.tbActivity.Size = new System.Drawing.Size(588, 534);
this.tbActivity.TabIndex = 0;
this.tbActivity.Text = «Activity»;
this.tbActivity.UseVisualStyleBackColor = true;//Here’s the datagridview
this.dataGridView1.AllowUserToAddRows = false;
this.dataGridView1.AllowUserToDeleteRows = false;
this.dataGridView1.AutoGenerateColumns = false;
this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.dataGridView1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
this.fiscyearDataGridViewTextBoxColumn,
this.activityDataGridViewTextBoxColumn,
this.activitynmDataGridViewTextBoxColumn,
this.activityextendednameDataGridViewTextBoxColumn});
this.dataGridView1.DataSource = this.activityExtendedNameBindingSource;
this.dataGridView1.GridColor = System.Drawing.SystemColors.Control;
this.dataGridView1.Location = new System.Drawing.Point(10, 3);
this.dataGridView1.Margin = new System.Windows.Forms.Padding(0);
this.dataGridView1.Name = «dataGridView1»;
this.dataGridView1.RowHeadersWidth = 40;
this.dataGridView1.Size = new System.Drawing.Size(545, 472);
this.dataGridView1.TabIndex = 0;
Answers
-
Hi,
Do you mean you want to move or resize the tabControl?
Base on my understanding, you can set the size and location property of tabcontrol to resize and move.
There is another thread about resize tab control. You can dock the tabcontrol to the form.How to resize tab control?
If I misunderstood you, or you have other questions, please feel free to tell me.
Best regards,
Ling Wang
Please remember to click “Mark as Answer” on the post that helps you, and to click “Unmark as Answer” if a marked post does not actually answer your question. This can be beneficial to other community members reading the thread.
-
Marked as answer by
Friday, April 3, 2009 12:07 PM
-
Marked as answer by
#c# #winforms #tabcontrol #autosize
Вопрос:
У меня есть форма Windows с элементом управления вкладками и представлением списка.
Когда я запускаю приложение, я хочу, Width
чтобы элемент управления вкладками увеличивался/уменьшался, чтобы показывать все страницы вкладок без горизонтальной полосы прокрутки и Width
соответственно изменять размер формы, чтобы обеспечить видимость элемента управления вкладками и представления списка.
Ниже приведен скриншот.
Комментарии:
1. Как пользователь, я бы возненавидел эту идею (автоматического изменения размеров форм), так как это будет мешать макету, который я выбрал для своего рабочего стола. И, конечно же, скоро он достигнет ограничений по размеру экрана.
Ответ №1:
Чтобы автоматически изменить размер элемента управления TabControl до размера его заголовков, вам необходимо рассчитать ширину текста каждого заголовка. Это проще в случае, если для TabControl.SizeMode установлено значение Fixed, так как вы можете задать размер элемента.Ширина и все заголовки будут иметь одинаковую ширину.
Если TabControl.SizeMode
установлено значение по умолчанию Normal
, вам нужно измерить текст каждого заголовка, добавив 1px
для границы ( 2px
если это вторая страница вкладки — небольшая ошибка в базовом элементе управления).
В первом случае размер элемента управления TabControl равен:
tabControl1.Width = tabControl1.TabPages.Count * (tabControl1.ItemSize.Width 1);
во втором случае измерьте текст каждого заголовка с помощью TextRendrer.Измерительный текст:
private int MeasureTabPagesWidth(TabControl tc)
{
if (tc.TabPages.Count == 0) return tc.Width;
int newWidth = 0;
int border = tc.TabPages.Count == 2 ? 2 : 1;
var flags = TextFormatFlags.LeftAndRightPadding;
using (var g = tc.CreateGraphics()) {
foreach (TabPage tab in tc.TabPages) {
newWidth = TextRenderer.MeasureText(g, tab.Text, tc.Font,
new Size(int.MaxValue, tc.Font.Height 4), flags).Width border;
}
}
return newWidth;
}
Настройка макета:
- Добавьте панель TableLayoutPanel в свою форму с одной строкой и двумя столбцами (т. Е. Удалите одну строку).
- Добавьте элемент управления TabControl в ячейку слева, а поле списка — в другую ячейку.
- Установите стиль обеих ячеек
AutoSize
равным (после добавления элементов управления). - Установите панель TableLayoutPanel в положение:
AutoSize = true
,AutoSizeMode
= GrowAndShrink
- Таким же образом установите для формы автоматический размер
- Установите минимальный и максимальный размеры формы. Первый обычно устанавливается в размер дизайна, второй зависит от вас; вы можете использовать текущую рабочую область экрана в качестве ссылки.
- Рассчитайте новую ширину элемента управления TabControl при создании или загрузке Формы (т. Е. в его конструкторе или
OnLoad()
илиForm.Load
), чтобы форма автоматически изменяла размер до размера панели TableLayoutPanel, которая, в свою очередь, автоматически изменяла размер своих дочерних элементов управления.
Теперь вы можете добавлять или удалять страницы вкладок во время выполнения, и форма автоматически изменит размер до ширины, рассчитанной в элементе управления вкладками.Controlled и TabControl.Обработчики событий ControlRemoved (также проверяется, имеет ли добавленный элемент управления тип TabPage
).
Пример:
- Этот
MeasureTabPagesWidth()
метод показан выше. - Панель TableLayoutPanel называется
tlp1
- Элемент управления TabControl называется
tabControl1
- Кнопки, используемые в наглядном примере, имеют имена, определяющие их роль.
public partial class AutoSizeForm : Form
{
public AutoSizeForm()
{
InitializeComponent();
tabControl1.Width = MeasureTabPagesWidth(tabControl1);
}
private void tabControl1_ControlAdded(object sender, ControlEventArgs e)
{
// Event notified after the TabPage has been added
if (e.Control is TabPage) {
tabControl1.Width = MeasureTabPagesWidth(tabControl1);
}
}
private void tabControl1_ControlRemoved(object sender, ControlEventArgs e)
{
if (e.Control is TabPage) {
// Use deferred execution, since the TabPage is removed after
// the event handler method completes.
BeginInvoke(new Action(()=> tabControl1.Width = MeasureTabPagesWidth(tabControl1)));
}
}
private void btnAddPage_Click(object sender, EventArgs e)
{
tabControl1.TabPages.Add(new TabPage("New TabpPage Text"));
}
private void btnRemovePage_Click(object sender, EventArgs e)
{
if (tabControl1.TabPages.Count > 0) {
tabControl1.TabPages.RemoveAt(tabControl1.TabPages.Count - 1);
}
}
private void btnAddCtlToTLP_Click(object sender, EventArgs e)
{
tlp1.ColumnCount = 1;
tlp1.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize));
var mc = new MonthCalendar();
tlp1.SetColumn(mc, tlp1.ColumnCount - 1);
tlp1.Controls.Add(mc);
}
}
Вот как это работает:
Протестировано в Windows 7, так как, похоже, это используемая система
Пример Проекта:
Пример проекта на Google Диске ( .Net Framework 4.8
— C# 7.3
)
Перестройте решение перед запуском
Комментарии:
1. Я скопировал ваш код ver batim в свой проект после просмотра кода вашего проекта и не смог понять, почему размер моей формы изменился неправильно, затем я посмотрел на шрифт элементов управления вкладками, и когда я изменил его на Segio UI 9pt, это сработало для меня. Я согласен… если страниц будет слишком много, форма выйдет из-под контроля. Придется спросить об этом моего руководителя проекта.
2. Тоже Джими… Могу я, пожалуйста, спросить вас, какую программу вы используете для создания анимации захвата экрана, показывающей, как элемент управления вкладками растет и уменьшается? Я надеюсь, что это БЕСПЛАТНО, так как я хотел бы использовать это для будущих снимков экрана. Спасибо
3. Что касается размера формы, вы можете задать это
MaximumSize
свойство.MinimumSize
Свойству обычно присваивается размер дизайна. Я добавил заметку об этом. — Шрифт не проблема: проверьте дальше, в чем была разница. — Анимационная программа здесь создана ScreenToGif и, да, она бесплатная и с открытым исходным кодом (обновляйте ее каждый раз, когда она запрашивает ее).
Ответ №2:
Начиная с этой формы, я собираюсь добавить 8 вкладок во время выполнения, рассчитать ширину текста на вкладках размер заполнения x2 (с обеих сторон вкладок), а затем изменить размер элементов управления по мере необходимости.
public Form1()
{
InitializeComponent();
//Clear our default tabs.
tabControl1.TabPages.Clear();
//Add more tabs than would be visible by default
for (int i=1;i<=8;i )
{
tabControl1.TabPages.Add("Tab " i.ToString());
}
ResizeTabControl();
ResizeListViewControl();
ResizeForm();
}
void ResizeTabControl()
{
int tabCount = tabControl1.TabCount;
float length = 0;
using (Graphics g = CreateGraphics())
{
//Iterate through the tabs and get the length of the text.
for (int i = 0; i <= tabCount - 1; i )
length = g.MeasureString(tabControl1.TabPages[i].Text, tabControl1.Font).Width;
}
//Resize the tab control where X is the length of all text in the tabs plus padding x 2 x total tabs.
tabControl1.Size = new Size(Convert.ToInt32(length) (tabCount * 2 * tabControl1.Padding.X), tabControl1.Width);
}
void ResizeListViewControl()
{
//Move listview 10 pixels away from tabcontrol's edge
listView1.Location = new Point(tabControl1.Location.X tabControl1.Width 10, listView1.Location.Y);
}
void ResizeForm()
{
//Resize form to accomodate changes.
this.Width = listView1.Location.X listView1.Width 20;
}
После того, как все это сказано и сделано, вот как это выглядит:
И с 20 вкладками, потому что почему бы и нет.
Комментарии:
1.
using (Graphics g = CreateGraphics())
=> >using (var g = tabControl1.CreateGraphics())
(лучше используйте графику элемента управления, который вы на самом деле измеряете )-Как описано в комментариях, с помощью панели автоматического определения размеров TableLayoutPanel вам просто нужно установитьForm.AutoSize = true
(плюсGrowAndShrink
). Никаких других вычислений не требуется (это лучше из-за изменения размера точек на дюйм на разных экранах, иначе вам тоже пришлось бы это учитывать).2. Кстати, вы должны использовать
TextRenderer.MeasureText()
с.TextFormatFlags.LeftAndRightPadding
Затем вам просто нужно добавить1
в размерWidth
каждого фрагмента текста (чтобы включить рамку размером 1 пиксель).3. Большое спасибо, Микаэль. Ваш код работает, но высота tabControl1 занимает всю высоту формы. Как это можно изменить, чтобы использовать только длину элемента управления вкладкой?
4. Кроме того, после вкладки 8 в вашем примере есть некоторое дополнение к концу. Как это можно удалить?
Я перерисую графику Tab
для TabControl
, но я не могу установить для нее Width
.
Я хочу, чтобы текст Tab
и значок содержались в его размере.
Теперь что-то вроде этого:
Мой код
private void tabControlForm_DrawItem(object sender, DrawItemEventArgs e)
{
try
{
using (Brush br = new SolidBrush(TabColors[tabControlForm.TabPages[e.Index]]))
{
Rectangle rect = e.Bounds;
rect.Width += 10;
e.Graphics.FillRectangle(br, rect);
SizeF sz = e.Graphics.MeasureString(tabControlForm.TabPages[e.Index].Text, e.Font);
e.Graphics.DrawString(tabControlForm.TabPages[e.Index].Text, e.Font, Brushes.Black, rect.Left + (rect.Width - sz.Width) / 2, rect.Top + (rect.Height - sz.Height) / 2 + 1);
using (var src = new Bitmap(System.Reflection.Assembly.GetEntryAssembly().GetManifestResourceStream("Castor.Gestionale.images.close-button.png")))
{
e.Graphics.DrawImage(src, rect.Right - 18, rect.Top + 10);
}
e.Graphics.DrawRectangle(Pens.DarkGray, rect);
e.DrawFocusRectangle();
}
}
catch {}
}
Спасибо
02 фев. 2016, в 15:43
Поделиться
Источник
2 ответа
К сожалению, нет встроенного свойства для управления шириной заголовка TabPages'
вкладки TabControl
индивидуально (Edit: по-видимому, существует TabControl.ItemSize
, чтобы управлять им коллективно. См. ответ TaW для исправления ширина всех страниц вкладок под управлением вкладки).
Но небольшая уловка, которую вы могли бы сделать, это дать дополнительный spaces
в левой или правой части TabPage.Text
, чтобы дать вам достаточно места для вашего значка.
Без пробела:
С 7 пробелами:
Должно быть достаточно разместить значок
Ian
02 фев. 2016, в 12:24
Поделиться
На самом деле вы можете установить размер вкладок, но не индивидуально.
Сочетание SizeMode = Fixed
и некоторого подходящего значения для TabControl.Itemsize
создаст любой размер, но всегда будет таким же..:
Итак, для индивидуального увеличения каждой вкладки, чтобы сделать значок подходящим, вам действительно нужно использовать метод Ian ‘spacey’.
TaW
02 фев. 2016, в 13:01
Поделиться
Ещё вопросы
- 1Как сделать так, чтобы оси занимали несколько вспомогательных участков при использовании графика даты и времени панд?
- 1как получить аргумент String внутри функции, возвращаемой как кортеж
- 1Извлечение определенного значения из строки JSON в python
- 0Установка GCC на Windows
- 1Почему я не могу заставить эти расширения работать?
- 1Как программно настроить прослушиватель Azure ServiceBus для режима подключения «AutoDetect»?
- 0Как получить только 1 результат из таблицы, которая содержит это значение более одного раза?
- 1Запуск и остановка услуг
- 0Передайте класс javascript в php как json / альтернативный путь
- 0Отключить всплывающую подсказку текста компонентов в iframe (другой домен)?
- 1ASP.Net MVC 4 Razor — просмотр результатов поиска на веб-сетке
- 0ожидаемое первичное выражение перед ‘int’
- 0Вывод данных JSON с локального веб-сервера в приложение Ionic с использованием Angular
- 1Java: Как добавить несколько внешних библиотек в makefile?
- 1Проверка подлинности Windows в MVC 5
- 0JS / jQuery: добавить класс до 2 делений при нажатии на один дел
- 1Как я могу получить доступ к DOM в AngularDart?
- 0Почему я не могу вызвать функцию при назначении $ scope в угловых?
- 0весна JPA java.sql. Дата принимает недействительные даты
- 1Строка обрабатывается как NULL, но ей присвоено значение, почему это происходит? (Использование C #)
- 1Группировка данных в сборе в одном формате в другой
- 1Использование EF Code First для ключевых таблиц / баз данных по идентификатору пользователя
- 0Node.js API с Express & MySQL — поиск нескольких значений в параметре поиска
- 0Углы повторения, ошибки формы и проверки
- 0Плавающая и ширина 100%
- 1Получить подкатегорию в соответствии с выбранной категорией Asp.net C #
- 0Проверка достоверности: уникальный параметр, 4-й параметр
- 0Освободить память из 2 разных DLL
- 0отображение объекта JSON в отдельные элементы div
- 0Вернуть имена узлов и текст в виде строки с XPath
- 0Перегрузка оператора C ++ со ссылкой на значение
- 1Доступ к таблице в таблице Excel с использованием C #
- 0PHP / MySQL, обнаруживающий изменение ценового столбца в таблице
- 0Mysql — Рекурсивный расчет баланса
- 0Многоязычность в Codeigniter
- 1Использование сканера и nextLine для завершения программы
- 1Можно ли закрепить индикатор выбора вкладки TabLayout в верхней части экрана при прокрутке?
- 1Проблемы с чтением символа ‘*’ в Python в новую строку
- 0Как я могу получить идентификатор данных в добавленной кнопке?
- 1Сортировать строки даты на карте [дубликаты]
- 1Проблема с установкой discord.py 1.0
- 1Нулевые переменные FXML
- 0только угловой список показать категорию в первый раз
- 1Подписание Android-приложения с ключом
- 1Как десериализовать JSON-Object?
- 1У объекта AttributeError «NoneType» нет атрибута «upload_from_filename»
- 1Агрегировать данные из массива объектов
- 0Jquery Загрузить внешнее изображение с интервалом
- 1Регулярное выражение (Reg exp). Почему это работает?
- 1Как удалить обработчики событий до загрузки, добавленные iFrame?
Я использую WPF с шаблоном MVVM. Как изменить размер WPF TabControl при изменении размера главного окна вручную? TabControl также должен изменять размер при максимальном увеличении или восстановлении. Не могли бы вы объяснить логику поставленного решения? Не могли бы вы предложить мне прочитать тему, которая связана с этой логикой. В приведенном ниже коде я — TabControl, чтобы обеспечить внешний вид MDI, где UserControl добавляется в TabControl.
DashboardView.xaml
<Window x:Class="MyProject.DashboardView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:MyProject"
Title="Resiable tabcontrol"
Width="1064"
Height="897"
WindowState="Normal"
WindowStartupLocation="CenterOwner">
<Window.Resources>
<local:TabSizeConverter x:Key="tabSizeConverter" />
<Style TargetType="{x:Type TabItem}">
<Setter Property="Width">
<Setter.Value>
<MultiBinding Converter="{StaticResource tabSizeConverter}">
<Binding RelativeSource="{RelativeSource Mode=FindAncestor,
AncestorType={x:Type TabControl}}" />
<Binding RelativeSource="{RelativeSource Mode=FindAncestor,
AncestorType={x:Type TabControl}}" Path="ActualWidth" />
</MultiBinding>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<DockPanel>
<Menu Name="menu1" VerticalAlignment="Top" Visibility="Visible"
DockPanel.Dock="Top" Loaded="menu1_Loaded">
<Menu.Background>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,0">
<LinearGradientBrush.GradientStops>
<GradientStop Offset="0" Color="White"/>
<GradientStop Offset="0" Color="White"/>
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</Menu.Background>
<MenuItem Header="File" Name="mnuTab" >
<MenuItem Header="List of High School"
Click="mnuTab1_Click"/>
<MenuItem Header="List of University"
Click="mnuTab2_Click" InputGestureText="Ctrl-U" />
<MenuItem Header="Exit" Click="mnuExit_Click" />
</MenuItem>
</Menu>
<Grid Width="Auto" Height="Auto" >
<TabControl Name="tcMdi" Visibility="Visible" HorizontalAlignment="Left"
VerticalAlignment="Top" ScrollViewer.HorizontalScrollBarVisibility="Auto"
ScrollViewer.VerticalScrollBarVisibility="Auto" >
<TabControl.Background>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,0">
<LinearGradientBrush.GradientStops>
<GradientStop Offset="0" Color="White" />
<GradientStop Offset="0" Color="White" />
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</TabControl.Background>
</TabControl>
</Grid>
</DockPanel>
</Window>
DashboardView.xaml.cs
namespace MyProject
{
public partial class DashboardView : Window
{
private Dictionary<string, string> _mdiChildren = new Dictionary<string, string>();
public DashboardView()
{
InitializeComponent();
WindowStartupLocation = System.Windows.WindowStartupLocation.CenterScreen;
}
private void mnuTab1_Click(object sender, RoutedEventArgs e)
{
ListOfHighSchoolView mdiChild = new ListOfHighSchoolView ();
AddTab(mdiChild);
txtBackground.Visibility = Visibility.Hidden;
}
private void mnuTab2_Click(object sender, RoutedEventArgs e)
{
ListOfHighUniversityView mdiChild = new ListOfHighUniversityView ();
AddTab(mdiChild);
txtBackground.Visibility = Visibility.Hidden;
}
private void mnuExit_Click(object sender, RoutedEventArgs e)
{
Application.Current.Shutdown();
}
// Add tab item to the tab
//This is the user control
private void AddTab(ITabbedMDI mdiChild)
{
//Check if the user control is already opened
if (_mdiChildren.ContainsKey(mdiChild.UniqueTabName))
{
//user control is already opened in tab.
//So set focus to the tab item where the control hosted
foreach (object item in tcMdi.Items)
{
TabItem ti = (TabItem)item;
if (ti.Name == mdiChild.UniqueTabName)
{
ti.Focus();
break;
}
}
}
else
{
//the control is not open in the tab item
tcMdi.Visibility = Visibility.Visible;
tcMdi.Width = this.ActualWidth;
tcMdi.Height = this.ActualHeight;
((ITabbedMDI)mdiChild).CloseInitiated += new delClosed(CloseTab);
//create a new tab item
TabItem ti = new TabItem();
//set the tab item's name to mdi child's unique name
ti.Name = ((ITabbedMDI)mdiChild).UniqueTabName;
//set the tab item's title to mdi child's title
ti.Header = ((ITabbedMDI)mdiChild).Title;
//set the content property of the tab item to mdi child
ti.Content = mdiChild;
ti.HorizontalContentAlignment = HorizontalAlignment.Stretch;
ti.VerticalContentAlignment = VerticalAlignment.Top;
//add the tab item to tab control
tcMdi.Items.Add(ti);
//set this tab as selected
tcMdi.SelectedItem = ti;
//add the mdi child's unique name in the open children's name list
_mdiChildren.Add(((ITabbedMDI)mdiChild).UniqueTabName, ((ITabbedMDI)mdiChild).Title);
}
}
private void CloseTab(ITabbedMDI tab, EventArgs e)
{
TabItem ti = null;
foreach (TabItem item in tcMdi.Items)
{
if (tab.UniqueTabName == ((ITabbedMDI)item.Content).UniqueTabName)
{
ti = item;
break;
}
}
if (ti != null)
{
_mdiChildren.Remove(((ITabbedMDI)ti.Content).UniqueTabName);
tcMdi.Items.Remove(ti);
txtBackground.Visibility = Visibility.Visible;
}
}
// Adjust the tab height and weight during load
private void menu1_Loaded(object sender, RoutedEventArgs e)
{
tcMdi.Width = this.ActualWidth;
tcMdi.Height = this.ActualHeight - 10;
}
}
}
Converters.cs
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Controls;
namespace MyProject
{
public class TabSizeConverter : System.Windows.Data.IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter,
System.Globalization.CultureInfo culture)
{
TabControl tabControl = values[0] as TabControl;
double width = tabControl.ActualWidth / tabControl.Items.Count;
//Subtract 1, otherwise we could overflow to two rows.
return (width <= 1) ? 0 : (width - 1);
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter,
System.Globalization.CultureInfo culture)
{
throw new NotSupportedException();
}
}
}