gpt4 book ai didi

.net - 使用 .NET 在 Windows 中创建弹出窗口 "toaster"通知

转载 作者:可可西里 更新时间:2023-11-01 11:55:10 25 4
gpt4 key购买 nike

我正在使用 .NET 并正在创建一个桌面应用程序/服务,当某些事件被触发时,它会在我桌面的一角显示通知。我不想使用过于干扰的常规消息框 b/c。我希望通知滑入 View ,然后在几秒钟后淡出。我正在考虑一些非常类似于新消息到达时收到的 Outlook 警报的东西。问题是:我应该为此使用 WPF 吗?我从来没有用 WPF 做过任何事情,但如果这是结束的最佳方式,我会很乐意尝试它。有没有一种方法可以使用常规 .NET 库来完成此操作?

最佳答案

WPF 使这一切变得微不足道:它可能需要十分钟或更短的时间。以下是步骤:

  1. 创建一个窗口,设置 AllowsTransparency="true"并向其添加一个网格
  2. 将 Grid 的 RenderTransform 设置为原点为 0,1 的 ScaleTransform
  3. 在网格上创建一个动画,将 ScaleX 设置为 0 到 1,然后将不透明度从 1 设置为 0
  4. 在构造函数中计算 Window.Top 和 Window.Left 以将窗口放置在屏幕的右下角。

仅此而已。

使用 Expression Blend 我花了大约 8 分钟来生成以下工作代码:

<Window
x:Class="NotificationWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Notification Popup" Width="300" SizeToContent="Height"
WindowStyle="None" AllowsTransparency="True" Background="Transparent">

<Grid RenderTransformOrigin="0,1" >

<!-- Notification area -->
<Border BorderThickness="1" Background="Beige" BorderBrush="Black" CornerRadius="10">
<StackPanel Margin="20">
<TextBlock TextWrapping="Wrap" Margin="5">
<Bold>Notification data</Bold><LineBreak /><LineBreak />
Something just happened and you are being notified of it.
</TextBlock>
<CheckBox Content="Checkable" Margin="5 5 0 5" />
<Button Content="Clickable" HorizontalAlignment="Center" />
</StackPanel>
</Border>

<!-- Animation -->
<Grid.Triggers>
<EventTrigger RoutedEvent="FrameworkElement.Loaded">
<BeginStoryboard>
<Storyboard>
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleY)">
<SplineDoubleKeyFrame KeyTime="0:0:0" Value="0"/>
<SplineDoubleKeyFrame KeyTime="0:0:0.5" Value="1"/>
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)">
<SplineDoubleKeyFrame KeyTime="0:0:2" Value="1"/>
<SplineDoubleKeyFrame KeyTime="0:0:4" Value="0"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Grid.Triggers>

<Grid.RenderTransform>
<ScaleTransform ScaleY="1" />
</Grid.RenderTransform>

</Grid>

</Window>

后面有代码:

using System;
using System.Windows;
using System.Windows.Threading;

public partial class NotificationWindow
{
public NotificationWindow()
{
InitializeComponent();

Dispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle, new Action(() =>
{
var workingArea = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea;
var transform = PresentationSource.FromVisual(this).CompositionTarget.TransformFromDevice;
var corner = transform.Transform(new Point(workingArea.Right, workingArea.Bottom));

this.Left = corner.X - this.ActualWidth - 100;
this.Top = corner.Y - this.ActualHeight;
}));
}
}

由于 WPF 是常规 .NET 库之一,所以答案是肯定的, 可以使用“常规 .NET 库”实现这一点。

如果您问是否有一种方法可以不使用 WPF 来执行此操作,答案仍然是肯定的,但它非常复杂并且需要 5 天而不是 5 分钟。

关于.net - 使用 .NET 在 Windows 中创建弹出窗口 "toaster"通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3034741/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com