2

我一直在尝试创建一个通知窗口,但我正在努力弄清楚为什么在我运行它时没有发生这种不透明度变化。相反,窗口将保持一秒钟然后关闭而没有任何可见的变化。我通过其他方法进行的所有其他尝试也都失败了,所以它一定是我缺少的一些属性。谢谢你的帮助!

    public void RunForm(string error, MessageBoxIcon icon, int duration)
    {
        lblMessage.Text = error;
        Icon i = ToSystemIcon(icon);
        if (i != null)
        {
            BitmapSource bs = System.Windows.Interop.Imaging.CreateBitmapSourceFromHIcon(i.Handle, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
            imgIcon.Source = bs;
        }
        this.WindowStartupLocation = WindowStartupLocation.Manual;
        this.Show();
        this.Left = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Right - this.RestoreBounds.Width - 20;
        this.Top = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Bottom - this.RestoreBounds.Height - 20;
        while (this.Opacity > 0)
        {
            this.Opacity -= 0.05;
            Thread.Sleep(50);
        }
        this.Close();
    }


<Window Width="225" Height="140" VerticalContentAlignment="Center" HorizontalAlignment="Center" ShowActivated="True" ShowInTaskbar="False"
ResizeMode="NoResize" Grid.IsSharedSizeScope="False" SizeToContent="Height" WindowStyle="None" BorderBrush="Gray" 
BorderThickness="1.5" Background="White" Topmost="True" AllowsTransparency="True" Opacity="1">
<Grid Height="Auto" Name="grdNotificationBox" >
    <Image Margin="12,12,0,0" Name="imgIcon" Stretch="Fill" HorizontalAlignment="Left" Width="32" Height="29" VerticalAlignment="Top" />
    <TextBlock Name="lblMessage" TextWrapping="Wrap" Margin="57,11,17,11"></TextBlock>
</Grid>

4

2 回答 2

2

这是行不通的:完整的 WPF 处理是在一个线程中完成的(技术上是两个,但并不重要)。您更改不透明度并直接让ui线程休眠,再次更改并将其送回休眠状态。ui 线程从来没有时间来处理你所做的事情。即使删除睡眠也无济于事,因为它会快得多,而且 ui 线程也无法处理任何请求。重要的是要了解您的代码和 WPF 处理是在同一个线程中完成的,您需要的时间越长,WPF 获得的时间就越少,反之亦然。

要解决它,您需要使用动画。他们正是为了这类事情。签出这个线程

于 2012-05-25T09:34:15.930 回答
1

您基本上是在阻止 UI 线程在while loop. 使用计时器或更合适地使用后台工作线程来执行此操作。

编辑:正如dowhilefor指出的那样,您可以为此目的使用 WPF 动画。这篇文章在这里详细讨论了这一点。

DoubleAnimation da = new DoubleAnimation();
da.From = 1;
da.To = 0;
da.Duration = new Duration(TimeSpan.FromSeconds(2));
da.AutoReverse = true;
da.RepeatBehavior = RepeatBehavior.Forever;
rectangle1.BeginAnimation(OpacityProperty, da);
于 2012-05-25T09:35:01.630 回答