Я использую.NET и создаю настольное приложение / сервис, который отобразит уведомления в углу моего Рабочего стола, когда определенные события будут инициированы. Я не хочу использовать регулярное Окно сообщения b/c, который был бы слишком навязчив. Я хочу, чтобы уведомления скользили в представление и затем постепенно исчезли после нескольких секунд. Я думаю о чем-то, что будет действовать очень как предупреждения Outlook, что каждый добирается, когда новое сообщение прибывает. Вопрос: я должен использовать WPF для этого? Я ничего никогда не делал с WPF, но счастливо попробую его, если это - лучшие средства в конец. Существует ли способ выполнить это с обычными библиотеками.NET?
WPF делает это абсолютно тривиальным: это, вероятно, займет десять минут или меньше. Вот шаги:
Вот и все.
Используя 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 минут.