To reproduce:
private void RadButton1_Click(object sender, EventArgs e)
{
Telerik.WinControls.UI.RadDesktopAlert _Alert = new Telerik.WinControls.UI.RadDesktopAlert();
_Alert.CaptionText = "TEST ALERT";
_Alert.ContentText = "This is my test content";
_Alert.AutoSize = true;
//RadDirection.Up bug when the screen is scaled (for example set creen scale at 150% => alert is cut, part of the window is not visible and the direction is still down)
//Whereas RadDirection.Down seems to work fine
_Alert.PopupAnimationDirection = Telerik.WinControls.UI.RadDirection.Down;
_Alert.Show();
}
When the ScreenPosition property of RadDesktopAlert is set to BottomRight in RightToLeft mode, it is shown in the center instead of in the right. Please refer to the attached sample project and attached screenshots. Workaround: RadDesktopAlert rdAlert = new RadDesktopAlert(); private void radButton1_Click(object sender, EventArgs e) { rdAlert.ContentText = "Sample text"; rdAlert.ScreenPosition = AlertScreenPosition.BottomRight; rdAlert.ShowOptionsButton = false; rdAlert.FixedSize = new System.Drawing.Size(490, 135); rdAlert.Popup.LocationChanged += Popup_LocationChanged; rdAlert.RightToLeft = System.Windows.Forms.RightToLeft.Yes; rdAlert.Show(); } Point p = Point.Empty; private void Popup_LocationChanged(object sender, EventArgs e) { DesktopAlertPopup popup = sender as DesktopAlertPopup; if (p == Point.Empty) { p = popup.Location; } else { rdAlert.Popup.LocationChanged -= Popup_LocationChanged; rdAlert.Popup.Location = p; rdAlert.Popup.LocationChanged += Popup_LocationChanged; } }
Workaround: keep track of the alerts and their location public partial class Form1 : Form { private Point location; private Rectangle initialRect; private bool displaySettingsChanged; private RadDesktopAlert dAlert; private HashSet<RadDesktopAlert> alerts; public Form1() { InitializeComponent(); this.initialRect = Screen.PrimaryScreen.WorkingArea; this.radDesktopAlert1.Popup.LocationChanged += Popup_LocationChanged; Microsoft.Win32.SystemEvents.DisplaySettingsChanged += SystemEvents_DisplaySettingsChanged; } private void Popup_LocationChanged(object sender, EventArgs e) { DesktopAlertPopup popup = sender as DesktopAlertPopup; RadDesktopAlert alert = this.alerts.Where(a => a.Popup == popup).FirstOrDefault(); if ((alert.Popup.Location.X != this.location.X || alert.Popup.Location.Y != this.location.X) && this.displaySettingsChanged && Control.MouseButtons != MouseButtons.Left) { alert.Popup.Location = this.location; } } private void SystemEvents_DisplaySettingsChanged(object sender, EventArgs e) { this.displaySettingsChanged = true; foreach (RadDesktopAlert alert in this.alerts) { this.AdjustPosition(alert); } } private void AdjustPosition(RadDesktopAlert alert) { Rectangle newRect = Screen.PrimaryScreen.WorkingArea; Point newLocation = DesktopAlertManager.Instance.GetAlertPopupLocation(alert); this.location = new Point(newLocation.X - (initialRect.Width - newRect.Width), newLocation.Y - (initialRect.Height - newRect.Height)); alert.Popup.Location = this.location; } private void radButton1_Click(object sender, EventArgs e) { this.dAlert = new RadDesktopAlert(); this.dAlert.PopupAnimationFrames = 1; this.dAlert.CanMove = false; this.dAlert.Show(); if (this.alerts == null) { this.alerts = new HashSet<RadDesktopAlert>(); } this.alerts.Add(this.dAlert); this.dAlert.Popup.LocationChanged += Popup_LocationChanged; if (this.displaySettingsChanged) { this.AdjustPosition(dAlert); } } }
To reproduce: use the following code: RadDesktopAlert desktopAlert = new Telerik.WinControls.UI.RadDesktopAlert(); public Form1() { InitializeComponent(); desktopAlert.AutoClose = false; RadButtonElement radButtonElement = new RadButtonElement(); radButtonElement.Click += RadDesktopAlertOkButtonClick; radButtonElement.Text = "OK"; desktopAlert.ButtonItems.Add(radButtonElement); desktopAlert.PopupAnimationDirection = RadDirection.Up; desktopAlert.PopupAnimationEasing = Telerik.WinControls.RadEasingType.InBack; BackgroundWorker bw = new BackgroundWorker(); bw.DoWork += new DoWorkEventHandler(bw_DoWork); bw.RunWorkerAsync(); } private void CreateAndShowAlert(string caption, string text) { desktopAlert.CaptionText = caption; desktopAlert.ContentText = text; desktopAlert.Show(); } void RadDesktopAlertOkButtonClick(object sender, EventArgs e) { desktopAlert.Hide(); } void bw_DoWork(object sender, DoWorkEventArgs e) { int i = 0; while (true) { Thread.Sleep(1000); i++; MethodInvoker mi = new MethodInvoker(delegate() { this.CreateAndShowAlert("Alert " + i, "This is the " + i + "th alert"); }); this.Invoke(mi); } } When I click the OK button, the DesktopAlert hides correctly, but after a few times (10 or more) the DesktopAlert stops appearing. Workaround: radDesktopAlert.Hide(); radDesktopAlert.Show(); or to switch off the animation: radDesktopAlert.PopupAnimation = false;