2

通知ウィンドウを作成しようとしていますが、実行したときにこの不透明度のシフトが発生しない理由を理解するのに苦労しています。代わりに、ウィンドウは1秒間保持されてから、目に見える変化なしに閉じます。他の方法による他のすべての試みも失敗したので、それは私が見逃しているいくつかのプロパティであるに違いありません。助けてくれてありがとう!

    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処理は1つの単一スレッドで実行されます(技術的には2つですが、重要ではありません)。不透明度を変更して、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 に答える