Search code examples
c#wpfpositionopacity

Bubble window opacity variation and position not working


I want to make a bubble window that GRADUALLY appears and vanishes after having displayed a message. I want its position to be near the tray and in the constructor I use for that:

 var screenSize = System.Windows.SystemParameters.WorkArea;
 this.Left = screenSize.Right - this.Width;
 this.Top = screenSize.Bottom - this.Height;

this has worked properly other times but now it doesn't.

Strangely enough also the opacity doesn't change. So to put it in a nutshell the window appear all of a sudden with no gradual transition at the center of the screen instead than near the tray.

This is the code:

 public BubbleWindow(string strMessage, double milliseconds)
{
  InitializeComponent();

  btYes.Content = strMessage;

  var screenSize = System.Windows.SystemParameters.WorkArea;
  this.Left = screenSize.Right - this.Width;
  this.Top = screenSize.Bottom - this.Height;

  int interval = (int)(milliseconds / 25);
  for (double iii = 0; iii <= 1; iii += .1)
  {
    Thread.Sleep(interval);
    this.Opacity = iii;
    Dispatcher.Invoke((Action)(() => { }), DispatcherPriority.Render);
    this.UpdateLayout();
  }
  this.Opacity = 1;
}

Thanks for any help


Solution

  • As for the position problem I had put the WindowPosition=CenterScreen in my xaml code. That overrode the .left and .top command.

    For the sake of completeness this is the complete Fade IN - wait - Fade out cycle:

    private Storyboard myStoryboard;
    
    public MainWindow()
    {
      InitializeComponent();
    
      DoubleAnimation fadeInAnimation = new DoubleAnimation() { From = 0.0, To = 1.0, Duration = new Duration(TimeSpan.FromSeconds(1)) };
      fadeInAnimation.Completed += FadeInAnimation_Completed;
      myStoryboard = new Storyboard();
      myStoryboard.Children.Add(fadeInAnimation);
      Storyboard.SetTargetName(fadeInAnimation, MyRectangle.Name);
      Storyboard.SetTargetProperty(fadeInAnimation, new PropertyPath(Rectangle.OpacityProperty));
      // Use the Loaded event to start the Storyboard.
      MyRectangle.Loaded += new RoutedEventHandler(myRectangleLoaded);
    }
    private void myRectangleLoaded(object sender, RoutedEventArgs e)
    {
      myStoryboard.Begin(this);
    }
    
    private void FadeInAnimation_Completed(object sender, EventArgs e)
    {
      DispatcherTimer timerFadeOut = new DispatcherTimer();
      timerFadeOut.Interval = TimeSpan.FromSeconds(2);
      timerFadeOut.Tick += TimerFadeOut_Tick;
      timerFadeOut.Start();
    }
    
    private void TimerFadeOut_Tick(object sender, EventArgs e)
    {
      DoubleAnimation fadeOutAnimation = new DoubleAnimation() { From = 1.0, To = 0.0, Duration = new Duration(TimeSpan.FromSeconds(1)) };
      myStoryboard = new Storyboard();
      myStoryboard.Children.Add(fadeOutAnimation);
      Storyboard.SetTargetName(fadeOutAnimation, MyRectangle.Name);
      Storyboard.SetTargetProperty(fadeOutAnimation, new PropertyPath(Rectangle.OpacityProperty));
      myStoryboard.Begin(this);
    }
    

    This works. That being said I am open to corrections.