Squ1zZy schreef op woensdag 13 januari 2016 @ 16:45:
Ik ben al een uurtje aan het stoeien met wat code, maar kom er helaas niet uit. Ik heb de gekste dingen gedaan, maar gezien mijn minimale kennis kom ik er gewoonweg niet uit
Ik heb een sysTray applicatie gemaakt die items, aan de hand van MenuItems.Add, toevoegd.
code:
1
2
3
4
5
6
7
8
9
10
11
12
| foreach (Process process in processlist)
{
if (!String.IsNullOrEmpty(process.MainWindowTitle))
{
sysTrayMenu.MenuItems.Add(process.MainWindowTitle, onTop);
}
}
private void onTop(object sender, EventArgs e)
{
Program.AlwaysOnTop("test");
} |
Dit werkt prima. Echter wil ik dat onTop wordt aangeroepen met als "process.MainWindowTitle" als parameter. Dus dat "test" wordt vervangen met MainWindowTitle. Ik mis alleen iets. Wie wil mij een zetje in de juiste richting geven?
Je wil dat de data van je process beschikbaar is in je event_handler. Aangezien die data alleen in de scope van je foreach loop beschikbaar is kun je er in je event_handler niet meer bij.
Daar zijn drie oplossingen voor:
1. Je maakt een class aan waar je die data instopt, en verplaatst de event handler naar die class
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| foreach (Process process in processlist)
{
if (!String.IsNullOrEmpty(process.MainWindowTitle))
{
var processData = new ProcessData(process.MainWindowTitle);
sysTrayMenu.MenuItems.Add(process.MainWindowTitle, processData.OnTop);
}
}
public class ProcessData
{
private string _title;
public ProcessData(string title)
{
_title = title;
}
public void OnTop(object sender, EventArgs args)
{
Program.AlwaysOnTop(_title);
}
} |
2: Je gebruikt een lambda/anonyous delegate en maakt gebruikt van de "Closure" functionaliteit
C#:
1
2
3
4
5
6
7
8
9
10
| foreach (Process process in processlist)
{
if (!String.IsNullOrEmpty(process.MainWindowTitle))
{
sysTrayMenu.MenuItems.Add(process.MainWindowTitle, (sender, args) =>
{
Program.AlwaysOnTop(process.MainWindowTitle);
});
}
} |
Wat YakuzA zegt is ook een optie, maar je wil niet perse dat je text van je MenuItem exact gelijk is aan de text die je mee wil geven. Je kan dan kiezen om de data in de Tag van je MenuItem te zetten.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| foreach (Process process in processlist)
{
if (!String.IsNullOrEmpty(process.MainWindowTitle))
{
var menuItem = sysTrayMenu.MenuItems.Add(process.MainWindowTitle, onTop);
menuItem.Tag = process.MainWindowTitle;
}
}
private void onTop(object sender, EventArgs e)
{
var title = ((MenuItem) sender).Tag as string;
if(title != null)
{
Program.AlwaysOnTop(title);
}
} |
Bovenstaande code zal waarschijnlijk niet exact compilen, want heb het uit de losse pols ingetypt, maar het gaat om het idee.
[
Voor 14% gewijzigd door
Woy op 14-01-2016 09:42
]
“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”