Я ищу способ создать эффект "это будет круто" для полноэкранного приложения WPF, над которым я работаю, - эффект "отблеска экрана", который анимируется или перемещается по всему экрану, создавая эффект сияющего отображения . Я думаю о создании большого прямоугольника с выделенным градиентом и прозрачным фоном, который можно было бы анимировать по всему экрану. Есть идеи, как это можно эффективно сделать в XAML?





Любую прозрачную панель легко разместить «поверх» основной сетки и анимировать элемент, размещенный на панели. Чтобы разместить панель «сверху», просто поместите ее в конце иерархии XAML после любого другого элемента. В качестве альтернативы вы можете использовать свойство «ZIndex».
Лоран
Вы можете поставить прозрачную панель сверху, как сказал LBugnion, но не забывайте, что есть много способов сделать это:
Если вы измените только альфа, он все равно будет кликабельный, даже если вы не видите цвет.
Не по теме, но: постарайтесь сделать эффект незаметным и, возможно, включите / выключите опцию.
К эта статья на индикаторах выполнения прикреплен пример кода, который имеет индикатор выполнения в стиле Vista, который имеет блеск в стиле Vista. Он использует границу, кисть и конвертер для создания анимации. Я не могу сказать, что полностью понимаю все в нем, но он отлично работает. Должно быть легко скопировать под свои нужды.
Я придумал решение, которое выглядит довольно неплохо. Пример кода XAML, который я записал в Blend 2.0 SP1, выглядит так:
<Window
xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
x:Class = "ScreenGlintApplication.Window1"
x:Name = "Window"
Title = "Window1"
Width = "500" Height = "250" Background = "#FF000000" Foreground = "#FF3EE229" >
<Grid x:Name = "LayoutRoot">
<TextBlock TextWrapping = "Wrap" FontSize = "40" >
<Run Text = "This is some sample text to have something to work with. Have a nice day! /Johan"/>
</TextBlock>
<Canvas Panel.ZIndex = "99" >
<Rectangle x:Name = "ScreenGlintRect"
Width = "{Binding Path=ActualWidth, ElementName=Window, Mode=Default}"
Height = "{Binding Path=ActualHeight, ElementName=Window, Mode=Default}"
Opacity = "0.4" >
<Rectangle.Triggers>
<EventTrigger RoutedEvent = "Rectangle.Loaded">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetName = "ScreenGlintRect"
Storyboard.TargetProperty = "(Canvas.Left)"
From = "-500" To = "1000" Duration = "0:0:2" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Rectangle.Triggers>
<Rectangle.Fill>
<LinearGradientBrush StartPoint = "0,1" EndPoint = "1,1">
<GradientStop Color = "Transparent" Offset = "0.0" />
<GradientStop x:Name = "GlintColor" Color = "LightGreen" Offset = "0.50" />
<GradientStop Color = "Transparent" Offset = "1" />
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
</Canvas>
</Grid>
</Window>
Можно сделать это в программном коде, что довольно удобно, если вы хотите детально контролировать анимацию. Например:
ScreenGlintRect.Width = Width;
ScreenGlintRect.Height = Height;
var animation = new DoubleAnimation
{
Duration = new Duration(TimeSpan.FromSeconds(2)),
From = (-Width),
To = Width * 2
};
ScreenGlintRect.BeginAnimation(Canvas.LeftProperty, animation);
Это код, который я использую, и он мне подходит. Если у вас есть аппаратное ускорение, вы можете попробовать добавить к нему размытие. Возможно, вам придется настроить код и скрыть / показать прямоугольник, но в основном это все.
Если есть интерактивные элементы управления, вам нужно добавить
IsHitTestVisible = "False"на холст.