Создайте раскрывающиеся уведомления “о тостере” в Windows с.NET

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

64
задан Antony 14 June 2010 в 06:36
поделиться

1 ответ

WPF делает это абсолютно тривиальным: это, вероятно, займет десять минут или меньше. Вот шаги:

  1. Создайте окно, установите AllowsTransparency = "true" и добавьте к нему сетку
  2. Установите RenderTransform сетки на ScaleTransform с исходной точкой 0,1
  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 минут.

110
ответ дан 24 November 2019 в 15:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: