Измените тип return
void
на List<String>
public static List<String> allButLast(List<String> list)
{
List<String> set = new ArrayList<String>();
String last=set.remove(set.size() - 1);
set.clear();
set.add(last);
return set;
}
или
public static List<String> allButLast(List<String> list)
{
List<String> set = new ArrayList<String>();
set.subList(0, set.size() - 1).clear();
return set;
}
НОВЫЙ ответ: Переопределите WndProc и заблокируйте сообщение WM_PAINT при применении новых свойств Window.
СТАРЫЙ ответ: Переопределите WndProc и заблокируйтесь WM_ERASEBKGND
сообщение.
Объяснение того, что ниже делает код:
Когда регион окна делается недействительным, Windows отправляет ряд сообщений к управлению, которые приводят к недавно нарисованному виджету. Раннее сообщение в этом ряду WM_ERASEBKGND
. Обычно, в ответ на это сообщение, управление красит себя сплошным цветом. Позже, в ответ на WM_PAINT
сообщение (который обычно используется нами в событии OnPaint) фактический рисунок сделано. Если этот рисунок будет нетривиален то будет задержка, прежде чем виджет будет обновлен, и Вы получите раздражающее мерцание.
При рассмотрении кода снова я ясно решал другую проблему. Попробуйте этот новый пример. Это заблокирует рисование формы/управления если bAllowPaint
флаг сброшен.
НОВЫЙ пример:
private const int WM_PAINT = 0x000F;
protected override void WndProc(ref Message m)
{
if ((m.Msg != WM_PAINT) ||
(bAllowPaint && m.Msg == WM_PAINT))
{
base.WndProc(ref m);
}
}
СТАРЫЙ пример:
private const int WM_ERASEBKGND = 0x0014;
protected override void WndProc(ref Message m)
{
if (m.Msg != WM_ERASEBKGND) // ignore WM_ERASEBKGND
{
base.WndProc(ref m);
}
}
Попробуйте Форму. Свойство DoubleBuffered. Установите его на 'истинный'.
Кроме того, если Ваша форма имеет какие-либо дочерние элементы управления, также установите DoubleBuffered на истинный для тех также (и детские дети, и т.д., по линии).
Наконец, назовите SuspendLayout перед своими изменениями и ResumeLayout впоследствии. Следует иметь в виду это единственное размещение влияния дочерних элементов управления. При выполнении какого-либо пользовательского рисунка, свойство DoubleBuffered даст Вам больше удара для маркера.
Вы изменяете свойства, которые оказывают довольно большое влияние на форму. TransparencyKey и FormBorderStyle требуют изменения битов стиля окна. Windows не позволяет тем битам стиля быть измененными. Windows Forms реализуют их путем завершенного уничтожения окна и воссоздания его с нуля. Аккуратный прием, но это занимает время, и форма будет перекрашена каждый раз, когда Вы изменяете стиль. При порождении неприятного визуального эффекта Вы видите.
Попробуйте это: 1. Непрозрачность набора к 0 так форма становится невидимой 2. Измените BackColor, без проблем 3. Измените FormBorderStyle, окно становится воссозданным 4. Измените TransparencyKey, окно становится воссозданным 5. Непрозрачность изменения к 1, окно воссоздается, затем видимое
Например:
this.Opacity = 0;
this.BackColor = Color.FromKnownColor(KnownColor.Control);
this.FormBorderStyle = FormBorderStyle.Sizable;
this.TransparencyKey = Color.Empty;
this.Opacity = 1;
Способ отправить все "изображение" формы на экран за один шаг состоит в том, чтобы включить DoubleBuffer.
В Конструкторе можно установить ControlStyles
VB.NET:
SetStyle(ControlStyles.DoubleBuffer, True)
Если все это не удастся, можно попробовать низкоуровневый взлом, заблокировав все сообщения о рисовании в форме.
ПРЕДУПРЕЖДЕНИЕ: Я не пропагандирую использование этого метода, но вы можете попробовать его, если действительно хотите. Он помог мне в прошлом.
Win32.LockWindowUpdate(this.Handle);
try
{
//make your changes here
}
finally
{
//release the lock
Win32.LockWindowUpdate((IntPtr)0);
}
Этот код опирается на следующий поддерживающий код:
public class Win32
{
private Win32() { }
/// <summary>
/// Lock ore relase the wndow for updating.
/// </summary>
[DllImport("user32")]
public static extern int LockWindowUpdate(HWND hwnd);
}