애니메이션을 이용해 버튼 깜빡이는 효과를 내는 코드입니다.

얼마전부터 WPF 학습을 시작해서 많이 허접합니다.

따로 설명을 안하고 코드상의 주석으로 대신하겠습니다.

 

 

 

Xaml 코드 입니다.

 

<Window.Resources>

        <Storyboard x:Key="sbBlinking">

            <!--타겟을 버튼으로두고, 타겟속성을 Opacity Opacity값을 1에서 0.3으로 줄였다가

             AutoReverse True이므로 다시 0.3에서 1 증가를 RepeatBehavior Forever이므로 무한정 반복-->

            <DoubleAnimation Storyboard.TargetName="btnStartOrEnd"

                             Storyboard.TargetProperty="Opacity"

                             From="1" To="0.3" Duration="0:0:1" RepeatBehavior="Forever"

                             AutoReverse="True">

            </DoubleAnimation>

        </Storyboard>

    </Window.Resources>

    <Canvas>

        <Label Name="lblState" Canvas.Left="54" Canvas.Top="10">Waiting</Label>

        <Button Click="btnStartOrEnd_Click"  Name="btnStartOrEnd" Content="Start" Height="23" Width="75" Margin="282,135,130,141" Canvas.Left="-127" Canvas.Top="-122" />

    </Canvas>

</Window> 

 

 

 

cs 코드입니다.

 

   

 /// <summary>

    /// MainWindow.xaml 대한 상호 작용 논리

    /// </summary>

    public partial class MainWindow : Window

    {

        const string TXT_START = "Start";

        const string TXT_DISCONNECT = "Disconnect";

        const string TXT_CONNECTING = "Connecting..";

        const string TXT_CONNECTED = "Connected!";

        const string TXT_WAITING = "Waiting..";

       

 

        public MainWindow()

        {

            InitializeComponent();

            this.Loaded += new RoutedEventHandler(MainWindow_Loaded);

        }

 

        void MainWindow_Loaded(object sender, RoutedEventArgs e)

        {

            this.btnStartOrEnd.Content = TXT_START;

        }

 

        private void btnStartOrEnd_Click(object sender, RoutedEventArgs e)

        {

            if (this.btnStartOrEnd.Content.Equals(TXT_START))

            {

                //Start

                this.TryConnect();

            }

            else if (this.btnStartOrEnd.Content.Equals(TXT_DISCONNECT))

            {

                //Disconnect

                this.UpdateUIContent(TXT_START, TXT_WAITING);

            }

        }

 

        /// <summary>

        /// 연결을 시도합니다.

        /// </summary>

        private void TryConnect()

        {

            //버튼과 레이블의 Content 변경하고

            this.UpdateUIContent(TXT_WAITING, TXT_CONNECTING);

            this.btnStartOrEnd.IsEnabled = false;

 

            //스토리보드 시작을 하고

            Storyboard sb = this.Resources["sbBlinking"] as Storyboard;

            //sb.Begin(this.btnStartOrEnd); //Xaml에서 지정하지 않을 경우 cs에서 직접 지정

            sb.Begin();

 

            //연결이 3 성공하였다고 가정한다.

            System.Windows.Threading.DispatcherTimer timer = new System.Windows.Threading.DispatcherTimer(new TimeSpan(0, 0, 3),

                  System.Windows.Threading.DispatcherPriority.SystemIdle, this.ConnectSuccess, this.Dispatcher);

        }

 

        /// <summary>

        /// 연결에 성공하였습니다.

        /// </summary>

        /// <param name="state"></param>

        //public void ConnectSuccess(object state)

        public void ConnectSuccess(object sender, EventArgs e)

        {

            System.Windows.Threading.DispatcherTimer timer = sender as System.Windows.Threading.DispatcherTimer;

            timer.Stop();

 

            this.UpdateUIContent(TXT_DISCONNECT, TXT_CONNECTED);

 

            Storyboard sb = this.Resources["sbBlinking"] as Storyboard;

            sb.Stop();

 

            this.btnStartOrEnd.IsEnabled = true;

        }

 

        /// <summary>

        /// 상태 UI 갱신합니다.

        /// </summary>

        /// <param name="btnContent"></param>

        /// <param name="lblContent"></param>

        private void UpdateUIContent(string btnContent, string lblContent)

        {

            this.btnStartOrEnd.Content = btnContent;

            this.lblState.Content = lblContent;

        }

    }

 

+ Recent posts