📄 configurationguihelper.cs
字号:
HexadecimalBinding binding = new HexadecimalBinding(textBox, defaultValue);
AddBinding(property, binding);
textBox.TextChanged += ControlValueChanged;
return binding;
}
class HexadecimalBinding : ConfigurationGuiBinding
{
TextBoxBase textBox;
int defaultValue;
public HexadecimalBinding(TextBoxBase textBox, int defaultValue)
{
this.textBox = textBox;
this.defaultValue = defaultValue;
}
public override void Load()
{
int val;
if (!int.TryParse(Get(defaultValue.ToString(NumberFormatInfo.InvariantInfo)), NumberStyles.Integer, NumberFormatInfo.InvariantInfo, out val)) {
val = defaultValue;
}
textBox.Text = "0x" + val.ToString("x", NumberFormatInfo.InvariantInfo);
}
public override bool Save()
{
string txt = textBox.Text.Trim();
NumberStyles style = NumberStyles.Integer;
if (txt.StartsWith("0x")) {
txt = txt.Substring(2);
style = NumberStyles.HexNumber;
}
int val;
if (!int.TryParse(txt, style, NumberFormatInfo.InvariantInfo, out val)) {
textBox.Focus();
// TODO: Translate Please enter a valid number.
MessageService.ShowMessage("Please enter a valid number.");
return false;
}
Set(val.ToString(NumberFormatInfo.InvariantInfo));
return true;
}
}
#endregion
#region Bind enum to ComboBox
/// <summary>
/// Bind enum to ComboBox
/// </summary>
public ConfigurationGuiBinding BindEnum<T>(string control, string property, params T[] values) where T : struct
{
return BindEnum(controlDictionary[control], property, values);
}
/// <summary>
/// Bind enum to ComboBox
/// </summary>
public ConfigurationGuiBinding BindEnum<T>(Control control, string property, params T[] values) where T : struct
{
Type type = typeof(T);
if (values == null || values.Length == 0) {
values = (T[])Enum.GetValues(type);
}
ComboBox comboBox = control as ComboBox;
if (comboBox != null) {
foreach (T element in values) {
object[] attr = type.GetField(Enum.GetName(type, element)).GetCustomAttributes(typeof(DescriptionAttribute), false);
string description;
if (attr.Length > 0) {
description = StringParser.Parse((attr[0] as DescriptionAttribute).Description);
} else {
description = Enum.GetName(type, element);
}
comboBox.Items.Add(description);
}
string[] valueNames = new string[values.Length];
for (int i = 0; i < values.Length; i++)
valueNames[i] = values[i].ToString();
ComboBoxBinding binding = new ComboBoxBinding(comboBox, valueNames, valueNames[0]);
AddBinding(property, binding);
comboBox.SelectedIndexChanged += ControlValueChanged;
comboBox.KeyDown += ComboBoxKeyDown;
return binding;
} else {
throw new ApplicationException("Cannot bind " + control.GetType().Name + " to enum property.");
}
}
/// <summary>
/// Bind list of strings to ComboBox.
/// entries: value -> Description
/// </summary>
public ConfigurationGuiBinding BindStringEnum(string control, string property, string defaultValue, params KeyValuePair<string, string>[] entries)
{
return BindStringEnum(controlDictionary[control], property, defaultValue, entries);
}
/// <summary>
/// Bind list of strings to ComboBox.
/// entries: value -> Description
/// </summary>
public ConfigurationGuiBinding BindStringEnum(Control control, string property, string defaultValue, params KeyValuePair<string, string>[] entries)
{
ComboBox comboBox = control as ComboBox;
if (comboBox != null) {
string[] valueNames = new string[entries.Length];
for (int i = 0; i < entries.Length; i++) {
valueNames[i] = entries[i].Key;
comboBox.Items.Add(StringParser.Parse(entries[i].Value));
}
ComboBoxBinding binding = new ComboBoxBinding(comboBox, valueNames, defaultValue);
AddBinding(property, binding);
comboBox.SelectedIndexChanged += ControlValueChanged;
comboBox.KeyDown += ComboBoxKeyDown;
return binding;
} else {
throw new ApplicationException("Cannot bind " + control.GetType().Name + " to enum property.");
}
}
class ComboBoxBinding : ConfigurationGuiBinding
{
ComboBox control;
string[] values;
string defaultValue;
public ComboBoxBinding(ComboBox control, string[] values, string defaultValue)
{
this.control = control;
this.values = values;
this.defaultValue = defaultValue;
}
public override void Load()
{
string val = Get(defaultValue);
int i;
for (i = 0; i < values.Length; i++) {
if (val.Equals(values[i], StringComparison.OrdinalIgnoreCase))
break;
}
if (i == values.Length) i = 0;
control.SelectedIndex = i;
}
public override bool Save()
{
Set(values[control.SelectedIndex]);
return true;
}
}
#endregion
#region Bind enum to RadioButtons
/// <summary>
/// Bind enum to RadioButtons
/// </summary>
public ConfigurationGuiBinding BindRadioEnum<T>(string property, params KeyValuePair<T, RadioButton>[] values) where T : struct
{
RadioEnumBinding<T> binding = new RadioEnumBinding<T>(values);
AddBinding(property, binding);
foreach (KeyValuePair<T, RadioButton> pair in values) {
pair.Value.CheckedChanged += ControlValueChanged;
}
return binding;
}
class RadioEnumBinding<T> : ConfigurationGuiBinding where T : struct
{
KeyValuePair<T, RadioButton>[] values;
internal RadioEnumBinding(KeyValuePair<T, RadioButton>[] values)
{
this.values = values;
}
public override void Load()
{
T val = Get(values[0].Key);
int i;
for (i = 0; i < values.Length; i++) {
if (val.Equals(values[i].Key))
break;
}
if (i == values.Length) i = 0;
values[i].Value.Checked = true;
}
public override bool Save()
{
foreach (KeyValuePair<T, RadioButton> pair in values) {
if (pair.Value.Checked) {
Set(pair.Key);
break;
}
}
return true;
}
}
#endregion
#endregion
#region ConfigurationSelector
/// <summary>
/// Gets the height of the configuration selector in pixel.
/// </summary>
public const int ConfigurationSelectorHeight = 30;
public Control CreateConfigurationSelector()
{
return new ConfigurationSelector(this);
}
public void AddConfigurationSelector(Control parent)
{
foreach (Control ctl in parent.Controls) {
ctl.Top += ConfigurationSelectorHeight;
}
Control sel = CreateConfigurationSelector();
sel.Width = parent.ClientSize.Width;
parent.Controls.Add(sel);
parent.Controls.SetChildIndex(sel, 0);
sel.Anchor |= AnchorStyles.Right;
}
sealed class ConfigurationSelector : Panel
{
ConfigurationGuiHelper helper;
Label configurationLabel = new Label();
ComboBox configurationComboBox = new ComboBox();
Label platformLabel = new Label();
ComboBox platformComboBox = new ComboBox();
Control line = new Control();
public ConfigurationSelector(ConfigurationGuiHelper helper)
{
const int marginTop = 4;
const int marginLeft = 4;
this.helper = helper;
this.Height = ConfigurationSelectorHeight;
configurationLabel.Text = StringParser.Parse("${res:Dialog.ProjectOptions.Configuration}:");
configurationLabel.TextAlign = ContentAlignment.MiddleRight;
configurationLabel.Location = new Point(marginLeft, marginTop);
configurationLabel.Width = 80;
configurationComboBox.Location = new Point(4 + configurationLabel.Right, marginTop);
configurationComboBox.Width = 120;
configurationComboBox.DropDownStyle = ComboBoxStyle.DropDownList;
platformLabel.Text = StringParser.Parse("${res:Dialog.ProjectOptions.Platform}:");
platformLabel.TextAlign = ContentAlignment.MiddleRight;
platformLabel.Location = new Point(4 + configurationComboBox.Right, marginTop);
platformLabel.Width = 68;
platformComboBox.Location = new Point(4 + platformLabel.Right, marginTop);
platformComboBox.Width = 120;
platformComboBox.DropDownStyle = ComboBoxStyle.DropDownList;
line.Bounds = new Rectangle(marginLeft, ConfigurationSelectorHeight - 2, Width - marginLeft * 2, ConfigurationSelectorHeight - 2);
line.BackColor = SystemColors.ControlDark;
this.Controls.AddRange(new Control[] { configurationLabel, configurationComboBox, platformLabel, platformComboBox, line });
line.Anchor |= AnchorStyles.Right;
FillBoxes();
configurationComboBox.SelectedIndexChanged += ConfigurationChanged;
platformComboBox.SelectedIndexChanged += ConfigurationChanged;
}
void FillBoxes()
{
List<string> items;
configurationComboBox.Items.Clear();
items = helper.Project.GetConfigurationNames();
items.Sort();
configurationComboBox.Items.AddRange(items.ToArray());
platformComboBox.Items.Clear();
items = helper.Project.GetPlatformNames();
items.Sort();
platformComboBox.Items.AddRange(items.ToArray());
ResetIndex();
}
bool resettingIndex;
void ResetIndex()
{
resettingIndex = true;
configurationComboBox.SelectedIndex = configurationComboBox.Items.IndexOf(helper.Configuration);
platformComboBox.SelectedIndex = platformComboBox.Items.IndexOf(helper.Platform);
resettingIndex = false;
}
void ConfigurationChanged(object sender, EventArgs e)
{
if (resettingIndex) return;
if (helper.IsDirty) {
if (!MessageService.AskQuestion("${res:Dialog.ProjectOptions.ContinueSwitchConfiguration}")) {
ResetIndex();
return;
}
if (!helper.Save()) {
ResetIndex();
return;
}
}
helper.Configuration = (string)configurationComboBox.SelectedItem;
helper.Platform = (string)platformComboBox.SelectedItem;
helper.Load();
}
}
#endregion
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -