2016-11-05 3 views
0

Я новичок в C# и не могу найти подходящее решение для своей проблемы. Я пытаюсь сделать мигающие линии над красной сиреной, как показано ниже в wpf. Когда я нажимаю кнопку, нарисованные линии должны мигать каждую секунду, как показано ниже.Мигающие линии над красной сиреной

Blinking lines over red siren

И ниже код для рисования красных линий над сиреной. 2. Параметр (bool a) предназначен для изменения видимости линий по таймеру.

// Below method is for drawing line and bool a parameter is for changing line visibility according to Mytimer_Tick. 
    public void DrawLine(Point[] points, bool a) 
    { 
     int i = 0; 
     int count = points.Length; 
      for (i = 0; i < count - 1; i += 2) 
      { 
     Line myline = new Line(); 
      myline.Stroke = Brushes.Red; 
      myline.StrokeThickness = 3; 
      myline.SnapsToDevicePixels = true; 
      myline.X1 = points[i].X; 
      myline.Y1 = points[i].Y; 
      myline.X2 = points[i + 1].X; 
      myline.Y2 = points[i + 1].Y; 
      Grid.Children.Add(myline); 

      if (a==true) 
      { 
       myline.Visibility = Visibility.Visible; 
      } 
      else 
      { 
       myline.Visibility = Visibility.Collapsed; 
      }   
     } 
    } 

И ниже часть - таймер с 1 секундой раз. Таймер начнется с кнопки.

// Timer with 1 sec. timespan. It's for making lines blink every second.  
    public void button_Click(object sender, RoutedEventArgs e) 
      { 
      DispatcherTimer mytimer = new DispatcherTimer(); 
       mytimer.Tick += Mytimer_Tick; 
       mytimer.Interval = new TimeSpan(0, 0, 1); 
       mytimer.Start(); }  

    private bool BlinkOn = true; 
    public void Mytimer_Tick(object sender, EventArgs e) 
    { 
     Point[] points = new Point[10] 
     { 
      new Point(100, 50), 
      new Point(100, 10), 

      new Point(115, 50), 
      new Point(145, 10), 

      new Point(125, 70), 
      new Point(185, 45), 

      new Point(85, 50), 
      new Point(55, 10), 

      new Point(75, 70), 
      new Point(25, 45), 
     }; 
     if(BlinkOn) 
     { 
      DrawLine(points, true); 
     } 
     else 
     { 
      DrawLine(points,false); 
     } 
     BlinkOn = !BlinkOn; 
     } 

Также ниже является XAML:

<Window x:Class="try_out_blinking_lines.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:local="clr-namespace:try_out_blinking_lines" 
    mc:Ignorable="d" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid x:Name="prid"> 
    <Grid x:Name="Grid" HorizontalAlignment="Left" Height="170" Margin="130,51,0,0" VerticalAlignment="Top" Width="206" RenderTransformOrigin="0.5,0.5"> 
     <Image x:Name="siren_r0_jpg" Margin="69,55,78,57" Source="siren_r0.jpg" Stretch="Fill"/> 
     <Border BorderThickness="2,2,2,2" BorderBrush="Green"></Border> 
    </Grid> 
    <Button x:Name="button" Content="Button" HorizontalAlignment="Left" Margin="201,261,0,0" VerticalAlignment="Top" Width="75" Click="button_Click"/> 

</Grid> 

И результат: он не мигает.

Я буду очень благодарен, если кто-то поможет. Спасибо,

ответ

0

Вам не нужен таймер для такого эффекта. Просто поместите пять строк в Canvas, и анимировать его непрозрачность на DoubleAnimation:

<Canvas> 
    <Canvas> 
     <Canvas.Triggers> 
      <EventTrigger RoutedEvent="Loaded"> 
       <BeginStoryboard> 
        <Storyboard Duration="0:0:2" RepeatBehavior="Forever"> 
         <DoubleAnimation Storyboard.TargetProperty="Opacity" 
             BeginTime="0:0:1" Duration="0:0:0" To="0"/> 
        </Storyboard> 
       </BeginStoryboard> 
      </EventTrigger> 
     </Canvas.Triggers> 
     <Line X1="100" Y1="10" X2="100" Y2="50" Stroke="Red" StrokeThickness="3"/> 
     <Line X1="145" Y1="10" X2="115" Y2="50" Stroke="Red" StrokeThickness="3"/> 
     <Line X1="55" Y1="10" X2="85" Y2="50" Stroke="Red" StrokeThickness="3"/> 
     <Line X1="185" Y1="45" X2="125" Y2="70" Stroke="Red" StrokeThickness="3"/> 
     <Line X1="25" Y1="45" X2="75" Y2="70" Stroke="Red" StrokeThickness="3"/> 
    </Canvas> 
    <Image Source="siren_r0.jpg" 
      Width="50" Height="50" Canvas.Left="75" Canvas.Top="55"/> 
</Canvas> 

Теперь вы можете выполнять все виды хороших мигающих эффектов непрерывно оживляющий непрозрачности, как

<Storyboard RepeatBehavior="Forever"> 
    <DoubleAnimation Storyboard.TargetProperty="Opacity" 
        Duration="0:0:0.5" To="0" AutoReverse="True"> 
     <DoubleAnimation.EasingFunction> 
      <CubicEase EasingMode="EaseOut"/> 
     </DoubleAnimation.EasingFunction> 
    </DoubleAnimation> 
</Storyboard> 
0

Теперь вы создаете их в каждом таймере, так что существует множество lines, созданных один над другим. Кроме того, вы не очищаете добавленные строки по параметру false.

Итак, создайте свои строки в Loaded Событие сетки.

И на каждый таймер, просто покажите/скройте их.

Кроме того, я бы использовал Canvas здесь.

Смежные вопросы