基本的に、私はTabControlを持っています。 私はヘッダーのテキストを自分で描いていますので、必要に応じて色を付けることができます。 色を変更する呼び出しは、TabControlとは異なるスレッド上にあります。そのため、代理人などをクロススレッド操作に使用しています。 不幸にも、私の方法は正確に信頼できるものではありません。ここでクロススレッドタブの描画
は、クロススレッド一部です:
delegate TabControl getTabDelegate();
private TabControl getTab()
{
if (this.channelTabs.InvokeRequired)
{
getTabDelegate d = new getTabDelegate(getTab);
this.Invoke(d);
return null;
}
else
{
return channelTabs;
}
}
、ここでは、描画コードです:あなたは、いくつかの例getTab()で、見ることができるように
private void channelTabs_DrawItem(object sender, DrawItemEventArgs e)
{
try
{
TabControl ct = getTab();
using (Brush br = new SolidBrush(TabColors[ct.TabPages[e.Index]]))
{
e.Graphics.FillRectangle(br, e.Bounds);
SizeF sz = e.Graphics.MeasureString(ct.TabPages[e.Index].Text, e.Font);
e.Graphics.DrawString(ct.TabPages[e.Index].Text, e.Font, Brushes.Black, e.Bounds.Left + (e.Bounds.Width - sz.Width)/2, e.Bounds.Top + (e.Bounds.Height - sz.Height)/2 + 1);
Rectangle rect = e.Bounds;
rect.Offset(0, 1);
rect.Inflate(0, -1);
e.Graphics.DrawRectangle(Pens.DarkGray, rect);
e.DrawFocusRectangle();
}
}
catch(Exception err)
{
MessageBox.Show(err.Message, "1");
}
}
。正確には役に立たないnullを返します。 これを行うには信頼性の高い方法がありますか?もちろん、私がスローされた例外が取得、
private void SetTabHeader(TabPage page, Color color)
{
TabColors[page] = color;
channelTabs.Invalidate();
}
クロススレッド一部なし:ここ
は、ヘッダーの色を変更するために、第2のスレッドから呼び出されるメソッドです。おそらく想像しているように、channelTabsはGUIタブコントロールです。
助けてください、ありがとう!
- ああ、実際に役立っている場合: プライベート辞書TabColors =新しい辞書();
可能複製(HTTP ://stackoverflow.com/questions/661561/how-to-update-gui-from-another-thread-in-c) –
プロパティを変更する方法のように見えるすべて、私はコントロールを取得しようとしていますそれには – CokaCola
それは同じ問題です。 GUI以外のスレッドからGUIを変更しています。 –