气泡窗口不透明度变化和位置不起作用

时间:2016-01-09 08:51:24

标签: c# wpf position opacity

我想创建一个GRALUALLY出现的气泡窗口,并在显示消息后消失。我希望它的位置靠近托盘和我使用的构造函数:

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

其他时候这种情况正常,但现在却没有。

奇怪的是,不透明度也没有改变。因此,简而言之,窗口突然出现,屏幕中央没有逐渐过渡,而不是靠近托盘。

这是代码:

 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;
}

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

您可以在XAML中使用此代码

<EventTrigger RoutedEvent="Rectangle.Loaded">
  <BeginStoryboard>
    <Storyboard>
      <DoubleAnimation
        Storyboard.TargetName="MyRectangle" 
        Storyboard.TargetProperty="Opacity"
        From="1.0" To="0.0" Duration="0:0:5" />
    </Storyboard>
  </BeginStoryboard>
</EventTrigger>

这是纯粹的XAML方式

或者您可以使用

<Storyboard x:Name="anim">
    <DoubleAnimation
        Storyboard.TargetName="MyRectangle" 
        Storyboard.TargetProperty="Opacity"
        From="1.0" To="0.0" Duration="0:0:5" />
</Storyboard>

然后从c#

开始动画

您可以参考here

答案 1 :(得分:0)

至于位置问题,我把WindowPosition = CenterScreen放在我的xaml代码中。这超出了.left和.top命令。

为了完整起见,这是完整的淡入淡出 - 等待 - 淡出循环:

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);
}

这很有效。话虽如此,我愿意接受更正。