Все они в точности идентичны
"a $b {$c}"
qq "a $b {$c}"
Q :qq "a $b {$c}"
Q :double "a $b {$c}"
Q :b :s :a :h :c :f "a $b {$c}"
Q :backslash :scalar :array :hash :closure :function "a $b {$c}"
Чтобы синтаксический анализатор строковых литералов рассматривал {}
как создающее замыкание, ему необходимо включить функцию замыкания.
Одной из вещей, которую позволяют :qq
/ :double
, является :c
/ :closure
.
Вы также можете отключить его с помощью :!closure
.
say qq :!closure "{ 1 + 2 }";
# { 1 + 2 }
То есть он начинается с семантики :qq
/ :double
и отключает семантику :closure
.
Здесь - это то, где функция qq
определена в Rakudo
role qq does b1 does c1 does s1 does a1 does h1 does f1 {
token starter { \" }
token stopper { \" }
method tweak_q($v) { self.panic("Too late for :q") }
method tweak_qq($v) { self.panic("Too late for :qq") }
}
b1
включает обратную косую черту c1
включает закрытие [ 1134] s1
включает скаляр a1
включает массив h1
включает хэш f1
включает функцию
[ 1149] Это задокументировано, и вы предоставили ссылку на документацию.
Возможно, можно пояснить, что:
""
- это сокращение от qq ""
qq ""
- это сокращение от Q :qq ""
/ Q :double ""
:qq
/ :double
сокращенно от всех :backslash
:closure
:scalar
:array
:hash
:function
. Также, возможно, стоит добавить примеры для всех этих функций.
Система. Windows. Формы. ListView добьется цели очень легко. Вам, возможно, придется работать немного тяжелее, чем ListBox, если Вы хотите список в представлении 'деталей' все же.
Следующий код отображается, как сделать пользовательский рисунок в поле списка.
using System.Windows.Forms;
using System.Drawing;
namespace Toolset.Controls
{
public class CustomDrawListBox : ListBox
{
public CustomDrawListBox()
{
this.DrawMode = DrawMode.OwnerDrawVariable; // We're using custom drawing.
this.ItemHeight = 40; // Set the item height to 40.
}
protected override void OnDrawItem(DrawItemEventArgs e)
{
// Make sure we're not trying to draw something that isn't there.
if (e.Index >= this.Items.Count || e.Index <= -1)
return;
// Get the item object.
object item = this.Items[e.Index];
if (item == null)
return;
// Draw the background color depending on
// if the item is selected or not.
if ((e.State & DrawItemState.Selected) == DrawItemState.Selected)
{
// The item is selected.
// We want a blue background color.
e.Graphics.FillRectangle(new SolidBrush(Color.Blue), e.Bounds);
}
else
{
// The item is NOT selected.
// We want a white background color.
e.Graphics.FillRectangle(new SolidBrush(Color.White), e.Bounds);
}
// Draw the item.
string text = item.ToString();
SizeF stringSize = e.Graphics.MeasureString(text, this.Font);
e.Graphics.DrawString(text, this.Font, new SolidBrush(Color.White),
new PointF(5, e.Bounds.Y + (e.Bounds.Height - stringSize.Height) / 2));
}
}
}
Steve, эта статья могла бы указать на Вас в правильном направлении:
http://www.codeproject.com/KB/combobox/glistbox.aspx
В WPF это довольно просто, но если Вы используете winforms, Вы не можете сделать этого с Системой. Windows. Формы. Управление ListBox. Вы можете делать это с управлением ListView или сторонними средствами управления.