اجرا و نمایش انیمیشن در WPF هنگام کلیک روی دکمه
سلام من با استفاده از Blend for visual studio اومدم یک انیمیشن برای یک دکمه توی صفحه ام گذاشتم .
و اون دکمه هم توی رویداد یکسری عملیات انجام میشه.
این انیمیشن اگر روی رویداد ماوس اور یا همون زمانی که ماوس فقط بیاد روی رکمه وایسه اجرا میشه و مشکلی نداره
اما اگر این انیمیشن رو بیام توی رویداد Click یا حتی PreviewMouseDown انیمیشن ناقص اجرا میشه انگار که رویداد کلیک باتن از همه اولویت داره و نمیذاره چیزه دیگه ای اجرا بشه.
به عبارتی انیمیشن بعد از یک لحظه شروع متوقف میشه. تا عملیات دکمه انجام بشه بعد انیمیشن رو ادامه میده
چیکار کنیم که این مشکل حل بشه.
در Blend :

در XAML :
<Window.Resources>
<Storyboard x:Key="RotationBtn">
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[2].(RotateTransform.Angle)" Storyboard.TargetName="Command4">
<EasingDoubleKeyFrame KeyTime="0:0:1" Value="720"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</Window.Resources>
<Window.Triggers>
<EventTrigger RoutedEvent="UIElement.PreviewMouseDown" SourceName="Command4">
<BeginStoryboard x:Name="RotationBtn_BeginStoryboard" Storyboard="{StaticResource RotationBtn}"/>
</EventTrigger>
</Window.Triggers>
<Grid>
<Button x:Name="Command4" Content="Next Stage" Margin="599,406,304,84" Width="130" Height="37" FontSize="8" Click="Command4_Click" Background="#FFDDDDDD" BorderBrush="{x:Null}" RenderTransformOrigin="0.5,0.5">
<Button.RenderTransform>
<TransformGroup>
<ScaleTransform/>
<SkewTransform/>
<RotateTransform/>
<TranslateTransform/>
</TransformGroup>
</Button.RenderTransform>
</Button>
</Grid>
در سی شارپ کد :
private void Command4_Click(object sender, RoutedEventArgs e)
{
var MyQuery = dbms.Database.SqlQuery<DB_Cust>("SELECT * FROM Customers").ToList();
}
من یک راهی که اودم امتحان کنم اینه که بهش Thread بدم اما این هم درست کار نمیکنه :
راه حل تستی اول
private void Command4_Click(object sender, RoutedEventArgs e)
{
Thread trd = new Thread(() =>
{
Dispatcher.Invoke((Action)(() =>
{
Storyboard sb = TryFindResource("RectangleSlider") as Storyboard;
Storyboard.SetTarget(sb, Command4 );
sb.Begin();
}));
});
var MyQuery = dbms.Database.SqlQuery<DB_Cust>("SELECT * FROM Customers").ToList();
}
راه حل تستی دوم
private void Command4_Click(object sender, RoutedEventArgs e)
{
new Thread(() =>
{
App.Current.Dispatcher.Invoke((Action)delegate
{
Storyboard sb = TryFindResource("RectangleSlider") as Storyboard;
Storyboard.SetTarget(sb, Command4);
sb.Begin();
});
}).Start();
var MyQuery = dbms.Database.SqlQuery<DB_Cust>("SELECT * FROM Customers").ToList();
}
این دوتا راه حلی که تست کردم فایده ای نداشت
این لینکی که توی استک اورفلو گذاشتم :
How to fix Animation Does not correct working after running Button's Event in C# WPF
لطفا راهنمایی بفرمایید
باتشکر از همگی
پاسخ هوش مصنوعی
برای حل مشکل متوقف شدن انیمیشن در هنگام کلیک روی دکمه در WPF، شما می توانید عملیات سنگین را در یک Thread جداگانه انجام دهید و انیمیشن را در Thread اصلی ادامه دهید. در اینجا روشی پیشنهاد می شود که از async/await استفاده می کند تا عملیات پایگاه داده را به صورت غیرهمگام انجام دهد.
ابتدا مطمین شوید که متد DbContext شما باز هم از خلاصه سازی async پشتیبانی می کند. سپس کد زیر را به کار ببرید:
private async void Command4_Click(object sender, RoutedEventArgs e)
{
// اجرای انیمیشن
Storyboard sb = TryFindResource("RotationBtn") as Storyboard;
Storyboard.SetTarget(sb, Command4);
sb.Begin();
// انجام عملیات پایگاه داده به صورت غیرهمگام
var MyQuery = await Task.Run(() => dbms.Database.SqlQuery<DB_Cust>("SELECT * FROM Customers").ToList());
}
در این کد، ابتدا انیمیشن شروع می شود و سپس عملیات پایگاه داده در یک Task جدید اجرا می شود تا تاخیر در UI ایجاد نشود. با این کار می توانید انیمیشن را هنگام پردازش داده ها همچنان فعال نگه دارید.
همچنین اطمینان حاصل کنید که نوع متد `Command4_Click` را به `async void` تغییر دهید چون که از `await` استفاده می کنید.
- آموزش استفاده از پلاگین گردونه شانس در Asp.net core به همراه سورس
- نمایش متن به صورت فرمت شده در CkEditor
- آموزش استفاده از SignalR در Asp.net Core با مثال عملی
- ادغام چند گزارش استیمول سافت بصورت پی دی اف در یک فایل
- نحوه تغییر استایل کامپوننت select2 چگونه است ؟
- چگونه امنیت پروژه را در Asp.net Core افزایش دهیم ؟
- ارسال پارامتر در دستور window.open جی کویری
- ارسال پارامتر از طریق جاوااسکریپت با کلیک روی تگ a
- خطای 500 زمان اجرا شدن پروژه روی هاست
- کویری نویسی در استیمول سافت جهت فیلتر اطلاعات
- مشکل تاریخ شمسی در سی شارپ
- نمایش گزارش stimulsoft روی کلاینت
- تفاوت های سی شارپ 8 با نسخه های قبلی چیه؟
- انتخاب چند سطر دلخواه توسط چک باکس در DataGrid و محاسبه جمع سطرهای انتخاب شده
- نمایش نوتیفکیشن در سی شارپ
- ارسال پارامتر از سی شارپ به استیمول سافت
- عدم نمایش عکس در دیتاگرید ویو در wpf
- Library Animation برای کنترلهای WPF
- مشکل در تغییر مقدار Text کنترل RibbonBar در کامپوننت DevExpress
- قرار دادن مقادیر ارسالی یک ستون از جدول به صورت سطری در استیمول