Функция проверки, которую вы передаете на state.contacts.find
, должна возвращать логическое значение. Вы просто сравниваете element.id == id
, но ничего не возвращаете.
Итак, измените его на:
export const contacts_getPersonById = state => id => {
return state.contacts.find(element => {
return element.id == id;
});
};
или просто
export const contacts_getPersonById = state => id => {
return state.contacts.find(element => element.id == id);
};
Если вы хотите нарисовать анимированный текст на элементе управления, вам нужно создать собственный элемент управления с таймером, затем переместить расположение текста в таймере и сделать элемент управления недействительным. Переопределите его краску и визуализируйте текст в новом месте.
Пример
В следующем примере я создал элемент управления MarqueeLabel
, который анимирует текст по вертикали:
using System;
using System.Drawing;
using System.Windows.Forms;
public class MarqueeLabel : Label
{
Timer timer;
public MarqueeLabel()
{
DoubleBuffered = true;
timer = new Timer();
timer.Interval = 100;
timer.Enabled = true;
timer.Tick += Timer_Tick;
}
int? top;
int textHeight = 0;
private void Timer_Tick(object sender, EventArgs e)
{
top -= 3;
if (top < -textHeight)
top = Height;
Invalidate();
}
protected override void OnPaint(PaintEventArgs e)
{
e.Graphics.Clear(BackColor);
var s = TextRenderer.MeasureText(Text, Font, new Size(Width, 0),
TextFormatFlags.TextBoxControl | TextFormatFlags.WordBreak);
textHeight = s.Height;
if (!top.HasValue) top = Height;
TextRenderer.DrawText(e.Graphics, Text, Font,
new Rectangle(0, top.Value, Width, textHeight),
ForeColor, BackColor, TextFormatFlags.TextBoxControl |
TextFormatFlags.WordBreak);
}
protected override void Dispose(bool disposing)
{
if (disposing)
timer.Dispose();
base.Dispose(disposing);
}
}