Ändra färg på Context Menu Strip (C#)

Permalänk
Medlem

Ändra färg på Context Menu Strip (C#)

Finns det något enkelt sätt att ändra bakgrundsfärgen och textfärgen i en context menu strip? Det finns ju properties för det, men jag menar att jag vill ändra färg på alla toolStripMenuItems, d.v.s t.o.m på dropdown menyer i ContextMenuStrip:en

Jag har t ex en Context Menu Strip som heter cmsMenu, i den har jag 2 st dropdown menyer som heter "File" och "Edit". I dessa dropdownmenyer finns några toolStripMenuItem:s. Om jag ändrar färgen på "File" och "Edit" så kommer färgen inte ändras på toolStripMenuItem:sarna som ligger under "File" och "Edit".

Koden jag har för att ändra på "File" och "Edit":

for (int i = 0; i < cmsMenu.Items.Count; i ++) { cmsMenu.Items[i].ForeColor = Sample_Project.Properties.Settings.Default.Color; }

Så det jag vill göra är att ändra färgen på allt som finns i min meny.
Visst kan jag skriva det för hand, men eftersom jag har ganska många menyer tar det lång tid och dessutom blir koden väldigt stor.

Visa signatur

Corsair 650W || MSI Z68A-GD65 (G3) || Asus R9 290 OCII || Intel i7 2600K, 3.4GHz || 4x4GB 1600MHz Corsair || Arch Linux || Fractal Design R4 || 120hz BenQ 24" 2ms + Benq 24" 2 ms || Cyborg Rat 7 || Corsair K90 || Logitech Z5500 5.1 Ljudsystem

Permalänk

Du ska inte köra WPF då?

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Medlem

Så det du undrar är egentligen hur man loopar igenom alla ContextMenuItems i en ContextMenuStrip?

Gör några sökningar på rekursiva funktioner, så kommer du nog på hur man löser detta. Sökförslag: C# rekursiv funktion

Här är en enkel rekursiv funktion för att räkna ut fakulteten av ett tal som Drutt här på forumet har skrivit (jag gjorde en sökning här):

public int fakultet (int n) { if(n == 0) return 1; else return n * fakultet(n - 1); }

Permalänk
Medlem

Det med fakultet var något nytt. Jag har gjort lite sökningar och jag har inte lyckats komma på hur jag ska göra detta fortfarande.
Om jag har förståt det rätt fakultet användas för att loopa igenom t ex array som innehåller arrays i sig? Typ såhär:

A 1 a b 2 a b B 1 a b 2 a b

Det jag försöker göra är att loopa igenom en liknande struktur som den ovan och kunna ange värde på en property i varje del av strukturen
Är fakultet samma sak som att göra såhär?

for (int i = 0; i < enLista.Count; i++ { for (int o = 0; o < enLista[i].Count; o++) { enLista[i].Items[o].ForeColor = Color.Black; } }

Stämmer detta?
Jag trodde det helt enkelt skulle vara att kör en liknande kod som i kod #2, men det visade sig att eftersom menyn innehåller separators så går det inte köra det eftersom separators har inte samma properties som ToolStripMenuItems.
Jag är lite halvtrög så bare with me ;P

@KurreKula
Jag började programmera detta programmet för länge sen och då visste jag inte vad WPF vad förnågot och nu har programmet några tusen linjer kod. Men om det går att konvertera från programmeringssättet jag kör nu till WPF så gör jag gärna det.

Visa signatur

Corsair 650W || MSI Z68A-GD65 (G3) || Asus R9 290 OCII || Intel i7 2600K, 3.4GHz || 4x4GB 1600MHz Corsair || Arch Linux || Fractal Design R4 || 120hz BenQ 24" 2ms + Benq 24" 2 ms || Cyborg Rat 7 || Corsair K90 || Logitech Z5500 5.1 Ljudsystem

Permalänk

Det är inte så att du ska ärva från Context Menu Strip och overridea Add och köra följande:

public override Add(ToolStripMenuItems item) { item.Background = this.Background; base.Add(item); }

antar att koden inte kompilerar men du förstår min tanke

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av toi
Om jag har förståt det rätt fakultet användas för att loopa igenom t ex array som innehåller arrays i sig?

Det jag försöker göra är att loopa igenom en liknande struktur som den ovan och kunna ange värde på en property i varje del av strukturen. Är fakultet samma sak som att göra såhär?

Jag trodde det helt enkelt skulle vara att kör en liknande kod som i kod #2, men det visade sig att eftersom menyn innehåller separators så går det inte köra det eftersom separators har inte samma properties som ToolStripMenuItems.

Nej alltså att beräkna fakulteten av ett tal var bara ett exempel Du kan läsa mer om fakultet här: http://sv.wikipedia.org/wiki/Fakultet_(matematik)

Det låter som att du förstår vad jag är ute efter, att loopa igenom alla arrayer som finns. Det kan man göra med en rekursiv funktion, vilket är en funktion som anropar sig själv. Jag gjorde ett test i C# och detta verkar fungera:

public void SkinRecursive(ContextMenuStrip cms) { skinRecursive(cms.Items); } private void skinRecursive(ToolStripItemCollection items) { foreach (ToolStripItem item in items) { // Iterate items in this collection // Make any adjustments (cast to correct type if needed) item.BackColor = Color.Black; item.ForeColor = Color.White; // Only ToolStripMenuItem can contain sub-items ToolStripMenuItem menuItem = item as ToolStripMenuItem; if (menuItem != null) // Item is of ToolStripMenuItem // Process sub-items too, recursively skinRecursive(menuItem.DropDownItems); } }

Du anropar den med ex. skinRecursive(contextMenuStrip1);
Läs igenom noga och fråga gärna! Det viktiga är att du förstår, inte att du nu har en kod som fungerar...

Som KurreKula säger kan man troligtvis använda Add, Render eller Init eller liknande för att få denna effekt. Men det är ju inte lika programmatiskt roligt!

Permalänk
Medlem

Jag tackar för detta!
Det är alltid roligt att lära sig något nytt!
Det funkar fin fint nu

Visa signatur

Corsair 650W || MSI Z68A-GD65 (G3) || Asus R9 290 OCII || Intel i7 2600K, 3.4GHz || 4x4GB 1600MHz Corsair || Arch Linux || Fractal Design R4 || 120hz BenQ 24" 2ms + Benq 24" 2 ms || Cyborg Rat 7 || Corsair K90 || Logitech Z5500 5.1 Ljudsystem