Använd vänsterpil och högerpil för att navigera
Eller Ctrl+P för att skriva ut till PDF (eller på papper)
Föreläsning 15
GUI:n och layout
Vad är ett GUI?
Ta emot indata från användaren
Utför beräkningar
Visa upp utdata för användaren
Vad skiljer sig?
Vi tar emot indatan på ett nytt sätt
Vi visar upp utdatan på ett nytt sätt
Men:
Beräkningarna är samma
Övergripande struktur
Kod som använder Windows Forms för att ta emot indata
Kod som använder Windows Forms för att visa upp utdata
Kod som utför beräkningarna, utan Windows Forms
Exempel
class MyForm : Form {
public MyForm() {
Button button = new Button {
Text = "Calculate Tax"
};
button.Click += OnButtonClick;
Controls.Add(button);
}
private void OnButtonClick(object sender, EventArgs e) {
double result = Tax.Calculate();
MessageBox.Show("Total tax: " + result);
}
}
Varför denna uppdelning?
GUI:n är komplicerade
Många olika delar av .NET
Fler möjligheter och scenarion som kan inträffa
Utseende, layout och användarvänlighet
Ju mindre kod som behöver hantera denna komplexitet desto bättre
Undantag
Ibland är beräkningarna väldigt korta
Ibland är beräkningarna väldigt nära knutna till GUI:t
Principen är "uppdelning", men slutmålet är "enkelhet"
Områden i Windows Forms
Kontroller (controls)
Färdiga GUI-komponenter ("widgets")
Layout
Hur och var kontroller placeras
Utseende
Färger, typsnitt och andra ytliga egenskaper
Händelser (events)
Vad som händer när användaren gör något
Kontroller
Button
TextBox
ProgressBar
TabControl
MonthCalendar
...
Layout
TableLayoutPanel
FlowLayoutPanel
Koordinater
TableLayoutPanel
TableLayoutPanel panel = new TableLayoutPanel {
RowCount = 2,
ColumnCount = 2,
BackColor = Color.Orange
};
panel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50));
panel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50));
panel.RowStyles.Add(new RowStyle(SizeType.Percent, 50));
panel.RowStyles.Add(new RowStyle(SizeType.Percent, 50));
Controls.Add(panel);
Dock
TableLayoutPanel panel = new TableLayoutPanel {
RowCount = 2,
ColumnCount = 2,
BackColor = Color.Orange
};
panel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50));
panel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50));
panel.RowStyles.Add(new RowStyle(SizeType.Percent, 50));
panel.RowStyles.Add(new RowStyle(SizeType.Percent, 50));
panel.Dock = DockStyle.Right;
Controls.Add(panel);
DockStyle.Fill
TableLayoutPanel panel = new TableLayoutPanel {
RowCount = 2,
ColumnCount = 2,
BackColor = Color.Orange,
Dock = DockStyle.Fill
};
panel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50));
panel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50));
panel.RowStyles.Add(new RowStyle(SizeType.Percent, 50));
panel.RowStyles.Add(new RowStyle(SizeType.Percent, 50));
Controls.Add(panel);
Innehåll i cellerna
TableLayoutPanel panel = new TableLayoutPanel {
RowCount = 2,
ColumnCount = 2,
BackColor = Color.Orange,
Dock = DockStyle.Fill
};
panel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50));
panel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50));
panel.RowStyles.Add(new RowStyle(SizeType.Percent, 50));
panel.RowStyles.Add(new RowStyle(SizeType.Percent, 50));
Button button1 = new Button {
Text = "My Button 1",
Dock = DockStyle.Fill
};
panel.Controls.Add(button1);
Button button2 = new Button { ... };
panel.Controls.Add(button2);
...
Controls.Add(panel);
Innehåller över flera rader/kolumner
TableLayoutPanel panel = new TableLayoutPanel {
RowCount = 2,
ColumnCount = 2,
BackColor = Color.Orange,
Dock = DockStyle.Fill
};
panel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50));
panel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50));
panel.RowStyles.Add(new RowStyle(SizeType.Percent, 50));
panel.RowStyles.Add(new RowStyle(SizeType.Percent, 50));
Button button1 = new Button {
Text = "My Button 1",
Dock = DockStyle.Fill
};
panel.Controls.Add(button1);
Button button2 = new Button { ... }
panel.Controls.Add(button2);
...
panel.SetColumnSpan(button1, 2);
Controls.Add(panel);
Tabeller inuti tabeller
TableLayoutPanel innerPanel = new TableLayoutPanel {
RowCount = 2,
ColumnCount = 2,
BackColor = Color.Pink,
Dock = DockStyle.Fill
};
innerPanel.Controls.Add(new Button {
Text = "My Button 4-1"
});
...
panel.Controls.Add(innerPanel);
Större exempel
TableLayoutPanel panel = new TableLayoutPanel
{
RowCount = 2,
ColumnCount = 2,
Dock = DockStyle.Fill
};
panel.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize));
panel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100));
panel.RowStyles.Add(new RowStyle(SizeType.AutoSize));
panel.RowStyles.Add(new RowStyle(SizeType.AutoSize));
panel.Controls.Add(new Label {
Text = "Name",
TextAlign = ContentAlignment.MiddleRight
});
panel.Controls.Add(new TextBox {
Text = "Please enter name here",
Dock = DockStyle.Fill
});
panel.Controls.Add(new Label {
Text = "Age",
TextAlign = ContentAlignment.MiddleRight
});
panel.Controls.Add(new NumericUpDown {
Value = 20,
Dock = DockStyle.Fill
});
Controls.Add(panel);
Dokumentation
Visual Studio
F1
Autocomplete
Google
Testa!
Visual Studio Designer
Men bara för experimenterande