애니메이션을 이용해 버튼 깜빡이는 효과를 내는 코드입니다.
얼마전부터 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; } } |
'.Net > WPF' 카테고리의 다른 글
DataGrid 데이터 유효성에 위배되는 Row 요소 검사 (0) | 2013.03.07 |
---|---|
Page 전체화면으로 설정하기 (1) | 2013.03.06 |
Page GoForward,GoBack Text 바인딩 해제되는 문제해결 (0) | 2013.03.06 |
Singleton 개체에 접근하기 (0) | 2013.03.05 |
UI자동화 & 스피치 (1) | 2011.04.26 |