protected virtual ToastMessageControl GetToastControl(Form form, object content) { string msg = content == null ? "(null)" : content.ToString(); var control = new ToastMessageControl(msg, Background, Foreground, Glow) { IsTransparent = true }; Font font = Font; if (font == null) { font = form.Font; } else { control.Font = font; } using (Graphics gr = control.CreateGraphics()) { SizeF textSize = gr.MeasureString(msg, font); control.Height = (int)textSize.Height + 25; control.Width = (int)textSize.Width + 35; if (textSize.Width > form.Width - 100) { control.Width = form.Width - 100; var hf = textSize.Width / control.Width; control.Height += (int)(textSize.Height * hf); } if (control.Height > form.Height) { control.Height = form.Height; } } return(control); }
private static void ClearControl(ToastMessageControl control) { control.TaskCompletionSource.TrySetResult(null); control.Parent?.Controls.Remove(control); ((Timer)control.Tag).Dispose(); control.Dispose(); }
public void Close() { var control = Control; if (control == null) { return; } Control = null; ServiceProvider.ThreadManager.Invoke(ExecutionMode.AsynchronousOnUiThread, control, control, (messageControl, toastMessageControl) => ClearControl(messageControl)); }
protected virtual ToastMessageControl ShowInternal(object content, float duration, ToastPosition position, IDataContext context, TaskCompletionSource <object> tcs) { Form activeForm = Form.ActiveForm; if (activeForm == null) { tcs.SetResult(null); return(null); } foreach (var result in activeForm.Controls.Find(ControlName, false).OfType <ToastMessageControl>()) { ClearControl(result); } ToastMessageControl control = null; var selector = activeForm.GetBindingMemberValue(AttachedMembers.Form.ToastTemplateSelector); if (selector != null) { control = (ToastMessageControl)selector.SelectTemplate(content, activeForm); } if (control == null) { control = GetToastControl(activeForm, content); } control.Duration = duration; control.TaskCompletionSource = tcs; control.Name = ControlName; activeForm.Controls.Add(control); SetPosition(activeForm, control, position); control.BringToFront(); var timer = new Timer { Interval = TimerInterval, Tag = control }; timer.Tick += TimerTick; timer.Start(); control.Tag = timer; return(control); }