ورود

View Full Version : سوال: ایجاد دکمه با پس زمینه شفاف



Mori Bone
چهارشنبه 02 مهر 1393, 11:50 صبح
سوالی که مربوط میشد به عنوان حل شد. حالا یه سوال دگ دارم که به سوال قبلیم مربوط میشه:
من کده زمل زیر رو دارم:(عکس گذاشتم تا راحت تر بشه خوندش)
می خوام وقتی روی استک پنلی که اسمش border_OpenMore هستش، کلیک شد، گریدی که بالا سرش هست ارتفاعش بشه 50 و اگه دوباره کلیک شد، گریده بشه 0.
باید چه کار کنم؟
123847

Mori Bone
چهارشنبه 02 مهر 1393, 21:29 عصر
قابل توجه مدیران. تالار wpf یکی از خلوت ترین تالار هاست. هیچکس نیست جواب تاپیک ها رو بده

helpsos
پنج شنبه 03 مهر 1393, 09:02 صبح
شما 2تا story board درست می کنید که این عملیات ها رو برات انجام بده.
بعد در قسمت code behind با دستورات C# این story board ها رو اجرا می کنی.

Mori Bone
پنج شنبه 03 مهر 1393, 09:19 صبح
این کده منه و الان به درستی کار میکنه. البته هم زمل هست و هم با کد:http://xum.ir/images/2014/09/25/Untitledd2e51.png




System.Windows.Threading.DispatcherTimer timer_HideMore = new System.Windows.Threading.DispatcherTimer();
private void check_OpenMore_Unchecked(object sender, RoutedEventArgs e)
{
Storyboard sb = this.FindResource("story_HideMore") as Storyboard;
sb.Begin();
timer_HideMore.Stop();
}


private void check_OpenMore_Checked(object sender, RoutedEventArgs e)
{
Storyboard sb = this.FindResource("story_ShowMore") as Storyboard;
sb.Begin();

timer_HideMore.Interval = new TimeSpan(0, 0, 0, 5);
timer_HideMore.Start();
timer_HideMore.Tick += delegate(object s, EventArgs e2)
{
sb = this.FindResource("story_HideMore") as Storyboard;
sb.Begin();
timer_HideMore.Stop();
check_OpenMore.IsChecked = false;
};
}

میخوام فقط با زمل این کار انجام بشه. با Data Triggers این کارو کردم. البته فقط باز شدن گرید رو انجام میده

rg_BlackRose
پنج شنبه 10 مهر 1393, 18:17 عصر
سلام

بهتره به جای StackPanel2 با نام
border_OpenMore از یک
ToggleButton استفاده کنید. و کدهی زیر رو در Window.Resources


<Window.Resources>
<Storyboard x:Key="story_ShowMore">
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="Height" Storyboard.TargetName="grid_More">
<EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="50"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
<Storyboard x:Key="story_HideMore">
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="Height" Storyboard.TargetName="grid_More">
<EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="0"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</Window.Resources>


و کدهای زیر رو در Triggers همون ToggleButton قرار بدید.

<ToggleButton.Triggers>
<EventTrigger RoutedEvent="ToggleButton.Checked" SourceName="toggleButton">
<BeginStoryboard Storyboard="{StaticResource story_ShowMore}"/>
</EventTrigger>
<EventTrigger RoutedEvent="ToggleButton.Unchecked" SourceName="toggleButton">
<BeginStoryboard Storyboard="{StaticResource story_HideMore}"/>
</EventTrigger>
</ToggleButton.Triggers>

Mori Bone
پنج شنبه 10 مهر 1393, 20:01 عصر
آقا ممنون از پاسختون. خودم با همین روش نوشتمش و کار کرد. ولی بازم ممنون. حالا اگه بخوام بعد از 15 ثانیه ببندتش چی؟ آیا میشه توی زمل این کارو کرد؟ خودم نوشتمش البته توی wpf code

2- یه آرایه از کنترل دارم که توی یه متغیر ذخیره کردم که از نوع rectangle هستش. حالا می هوام با animation مقدار convas.top همشون رو به 200 تغییر بدم. لبیته بدون دخالت زمل هستش و تمتم متغیرهام توی wpfcode هستش.

لطفا یه سر هم به لینک زیر بزنید:
کد ui برای کنترل button (http://barnamenevis.org/showthread.php?471129-%DA%A9%D8%AF-ui-%D8%A8%D8%B1%D8%A7%DB%8C-%DA%A9%D9%86%D8%AA%D8%B1%D9%84-button)

rg_BlackRose
پنج شنبه 10 مهر 1393, 23:11 عصر
سلام

در مورد سوال دوم راهنماییتون میکنم.

شما لیست rectangle ها رو در یک آرایه دارید، پس میتونید یک تابع تعریف کنید. مثل تابع زیر که کار اعمال انیمیشن مورد نظر بر روی کنترلی که از طریق آرگومان دریافت میکنه رو انجام بده.

private void AnimateRectangle(Rectangle rectangle, double top, TimeSpan time)
{
var moveAnimY = new DoubleAnimation(top, new Duration(time));


rectangle.BeginAnimation(Canvas.TopProperty, moveAnimY);
}


بعد در یک حلقه Foreach تک تک Rectangle ها رو به تابع بالا بفرستید. مثال:


if (rects.Count == 0)
return;


foreach (Rectangle rect in rects)
{
AnimateRectangle(rect, 200, TimeSpan.FromSeconds(2));
}

Mori Bone
جمعه 11 مهر 1393, 09:08 صبح
سلام

در مورد سوال دوم راهنماییتون میکنم.

شما لیست rectangle ها رو در یک آرایه دارید، پس میتونید یک تابع تعریف کنید. مثل تابع زیر که کار اعمال انیمیشن مورد نظر بر روی کنترلی که از طریق آرگومان دریافت میکنه رو انجام بده.

private void AnimateRectangle(Rectangle rectangle, double top, TimeSpan time)
{
var moveAnimY = new DoubleAnimation(top, new Duration(time));


rectangle.BeginAnimation(Canvas.TopProperty, moveAnimY);
}


بعد در یک حلقه Foreach تک تک Rectangle ها رو به تابع بالا بفرستید. مثال:


if (rects.Count == 0)
return;


foreach (Rectangle rect in rects)
{
AnimateRectangle(rect, 200, TimeSpan.FromSeconds(2));
}


ممنون. ولی میخوام با storyboard باشه تا بتونم. استپش کنم. اینه کده منه و لی کار نمی کنه:

Storyboard storyboard_IncreaseModelTop = new Storyboard();
DoubleAnimation[] dblAnims = new DoubleAnimation[nowModel.Squares.Count()];
for (int i = 0; i < nowModel.Squares.Count(); i++)
{
dblAnims[i] = new DoubleAnimation();
dblAnims[i].BeginTime = new TimeSpan(0);
dblAnims[i].To = 100;
dblAnims[i].Duration = new Duration(new TimeSpan(0, 0, 5));
Storyboard.SetTargetProperty(dblAnims[i], new PropertyPath("(Convas.Top)"));
Storyboard.SetTarget(dblAnims[i], nowModel.Squares[i]);
storyboard_IncreaseModelTop.Children.Add(dblAnims[i]);
}

storyboard_IncreaseModelTop.Begin();

rg_BlackRose
شنبه 12 مهر 1393, 16:03 عصر
سلام

شما متد dblAnims[i].From رو مقدار دهی نکردید شاید به این خاطر باشه.

من یک نمونه برنامه براتون آماده کردم امکان Pause, Resume, Stop and Satrt رو داره. (VS 2013)


امیدوارم مشکلتون حل بشه.


یا حق.