문제를 일으킨 것으로 보이는 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 }
}
}
틱 이벤트는 ** 한 번만 ** 구독하십시오. 당신이 지금하고있는 방법, 당신이 toggleCharmsBar()를 호출 할 때마다 또 다른 이벤트 핸들러를 추가하고 Tick 이벤트 핸들러가 여러 번 실행됩니다. 따라서 *보기 * 빠릅니다. –