Greetings,
While working with the RadDesktopAlert, I found an issue (possibly a bug) in the following scenario :
When RightToLeft property of RadDesktopAlert is set to True, ScreenPosition property doesn't work properly as it is supposed to.
For example, setting ScreenPosition to BottomRight and RightToLeft property to True, the popup box doesn't start at BottomRight position. I attached a gif file that illustrates the issue. Here is the code I used in the test project :
Imports
Telerik.WinControls
Imports
Telerik.WinControls.UI
Public
Class
Form1
Private
Sub
Button1_Click(sender
As
Object
, e
As
EventArgs)
Handles
Button1.Click
Dim
alert1
As
New
RadDesktopAlert
alert1.AutoCloseDelay = 3
alert1.AutoSize =
True
alert1.FadeAnimationFrames = 10
alert1.FadeAnimationSpeed = 3
alert1.Opacity = 0.85!
alert1.PopupAnimationEasing = Telerik.WinControls.RadEasingType.OutExponential
alert1.PopupAnimationFrames = 10
If
CheckBox1.Checked =
True
Then
alert1.RightToLeft = System.Windows.Forms.RightToLeft.Yes
Else
alert1.RightToLeft = System.Windows.Forms.RightToLeft.No
End
If
alert1.ScreenPosition = Telerik.WinControls.UI.AlertScreenPosition.BottomRight
alert1.ShowOptionsButton =
False
alert1.ShowPinButton =
False
alert1.CaptionText =
"Test Project"
alert1.ContentText =
"This is a test"
alert1.PlaySound =
True
alert1.Popup.AlertElement.Font =
New
Font(
"Tahoma"
, 10, FontStyle.Regular)
alert1.Popup.AlertElement.ContentElement.Font =
New
Font(
"Tahoma"
, 10, FontStyle.Regular)
alert1.Show()
End
Sub
End
Class
Best Wishes,
Thanks for your attention.
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();
}
To reproduce: change to 150% DPI scaling and try to show a RadDesktopAlert. Workaround: bool isFirstTime = true; private void radButton1_Click(object sender, EventArgs e) { this.radDesktopAlert1.CaptionText = "New E-mail Notification"; this.radDesktopAlert1.ContentText = "Hello Jack, I am writing to inform you " + "that the planning meeting scheduled for Wednesday has been postponed and" + "it will eventually be rescheduled, possibly for the next Tuesday"; if (isFirstTime) { this.radDesktopAlert1.PopupAnimation = false; this.radDesktopAlert1.Show(); this.radDesktopAlert1.Hide(); this.radDesktopAlert1.Show(); isFirstTime = false; } else { this.radDesktopAlert1.Show(); } }
To reproduce: RadDesktopAlert oNotificacion = new RadDesktopAlert(this.components); oNotificacion.FixedSize = new System.Drawing.Size(350, 150); oNotificacion.CaptionText = "TITLE"; oNotificacion.ContentText = "Alert TEXT"; oNotificacion.ContentImage = this.pictureBox1.Image; oNotificacion.Show(); Workaround: oNotificacion.Popup.Image = this.pictureBox1.Image;
To reproduce: - run the attached sample project - click the 'show' button - click the 'update text' button while the alert is shown. You will notice that the text is updated but the alert is now resized according to the new content. Workaround: hide the alert and show it again in order to force recalculating the size. Me.RadDesktopAlert1.PopupAnimation = False Me.RadDesktopAlert1.Hide() Me.RadDesktopAlert1.ContentText = Me.RadDesktopAlert1.ContentText & "Donec ornare, elit a lobortis luctus, mauris est interdum leo, eget malesuada ligula diam quis nunc." Me.RadDesktopAlert1.Show() Me.RadDesktopAlert1.PopupAnimation = True
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; } }
There should be an option in RadDesktopAlert which allows it to size according to its content.
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;
Workaround: create custom alert and popup and override the InitializeDropDownAnimation, refer to the attached project
One should be able to show a DesktopAlert at a custom position on the screen, defined by (x,y) coordinates. READY FOR TEST
FIX. RadDesktopAlert stays focused all the time, so using the Enter and the Backspace keys for example in an editor while the alert is shown causes the alert to close.