2015-01-08 9 views
0

문제를 일으킨 것으로 보이는 DispatcherTimers는 'openTimer'및 'closeTimer'입니다. 처음 활성화 된 경우 올바른 속도로 작동하지만 이후에는 타이머가 활성화 될 때마다 속도가 계속 증가합니다.DispatcherTimer가 C# WPF에서 천천히 빠르다

DispatcherTimer openTimer = new DispatcherTimer(); 
DispatcherTimer closeTimer = new DispatcherTimer(); 
DispatcherTimer openDropdown = new DispatcherTimer(); 
DispatcherTimer closeDropdown = new DispatcherTimer(); 
private void toggleCharmsBar() 
{ 
    btn_dropdown.IsEnabled = false; 
    btn_settings.IsEnabled = false; 
    if (btn_settings.Visibility == Visibility.Visible) 
    { 
     //close charms bar 
     btn_settings.Opacity = 1; 
     closeTimer.Tick += closeTimer_Tick; 
     closeTimer.Interval = TimeSpan.FromMilliseconds(5); 
     closeTimer.IsEnabled = true; 

     //close dropdown 
     closeDropdown.Tick += closeDropdown_Tick; 
     closeDropdown.Interval = TimeSpan.FromMilliseconds(2); 
     closeDropdown.IsEnabled = true; 
    } 
    else 
    { 
     //open charms bar 
     btn_settings.Visibility = Visibility.Visible; 
     btn_settings.Opacity = 0; 
     openTimer.Tick += openTimer_Tick; 
     openTimer.Interval = TimeSpan.FromMilliseconds(5); 
     openTimer.IsEnabled = true; 

     //open dropdown 
     openDropdown.Tick += openDropdown_Tick; 
     openDropdown.Interval = TimeSpan.FromMilliseconds(2); 
     openDropdown.IsEnabled = true; 
    } 
} 

private void closeDropdown_Tick(object sender, EventArgs e) 
{ 
    int rotateDropdownOpeningAngle = -270; 
    if (rotateDropdown.Angle == -270) { } 
    else 
    { 
     //Close Dropdown Spin 
     btn_dropdown.RenderTransformOrigin = new Point(0.5, 0.5); 
     rotateDropdown.Angle = rotateDropdownOpeningAngle; 
     btn_dropdown.RenderTransform = rotateDropdown; 
    } 
    closeDropdown.IsEnabled = false; 
} 

private void openDropdown_Tick(object sender, EventArgs e) 
{ 
    int rotateDropdownOpeningAngle = -360; 
    if (rotateDropdown.Angle == -360) { } 
    else 
    { 
     //Open Dropdown Spin 
     btn_dropdown.RenderTransformOrigin = new Point(0.5, 0.5); 
     rotateDropdown.Angle = rotateDropdownOpeningAngle; 
     btn_dropdown.RenderTransform = rotateDropdown; 
    } 
    openDropdown.IsEnabled = false; 
} 


private void closeTimer_Tick(object sender, EventArgs e) 
{ 
    if (btn_settings.Opacity < 0.02) 
    { 
     btn_settings.Opacity = 0; 
     btn_settings.Visibility = Visibility.Hidden; 
     btn_settings.IsEnabled = false; 
     closeTimer.IsEnabled = false; 
     btn_dropdown.IsEnabled = true; 
    } 
    else 
    { 
     //fade out settings cog 
     btn_settings.Opacity -= 0.02; 
     //if (btn_settings.Opacity == 0.5) { fade in next } 
    } 
} 

private void openTimer_Tick(object sender, EventArgs e) 
{ 
    if (btn_settings.Opacity > 0.98) 
    { 
     btn_settings.Visibility = Visibility.Visible; 
     btn_settings.Opacity = 1; 
     btn_settings.IsEnabled = true; 
     openTimer.IsEnabled = false; 
     btn_dropdown.IsEnabled = true; 
    } 
    else 
    { 
     //fade in settings cog 
     btn_settings.Opacity += 0.02; 
     //if (btn_settings.Opacity == 0.5) { fade in next } 
    } 
} 
+4

틱 이벤트는 ** 한 번만 ** 구독하십시오. 당신이 지금하고있는 방법, 당신이 toggleCharmsBar()를 호출 할 때마다 또 다른 이벤트 핸들러를 추가하고 Tick 이벤트 핸들러가 여러 번 실행됩니다. 따라서 *보기 * 빠릅니다. –

답변

1

ToggleCharmsBar() 메서드가 다시 호출 되나요? 추가 타이머를 지정하지 않으려면 선택하십시오. 이것은 더 빨리 나타나는 이유 일 수 있습니다. 실제로는 다른 클럭주기에있는 복제 된 타이머 일뿐입니다.

+1

Hans가 지적했듯이, 새로운 'Timer' 인스턴스는 생성되지 않습니다. 단순히 새로운 이벤트 핸들러가 기존의 Timer 인스턴스에 등록되어있는 것입니다. 그래서'openTimer_Tick()'이벤트 핸들러 메쏘드는 매 타이머 틱마다 여러 번 호출됩니다. –

+0

도움을 주신 모든 분들께 감사드립니다.) –