تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
الدرس السابع والخمسون - Wpf 2d
#1
كاتب الموضوع : أحمد جمال

بسم الله الرحمن الرحيم .
السلام عليكم ورحمة الله وبركاته .


نواصل في درسنا اليوم الحديث عن تقنيات WPF سيكون هذا في الواقع آخر درس تقني لنا وفي الدرس القادم سنختتم دروس WPF بتطبيقات سريعة على مجموعة Expression Studio .

درسنا اليوم سيتحدث عن تقنيات جديدة للرسوميات 2D في ال WPF ، سنتعرف على تقنيات شبيهة بتلك التي تعاملنا معها في GDI+ ولكن هذه المرة من خلال WPF .

بداية تحتوي خيارات الرسم على واحد من الفئات التالية :

System.Windows.Shapes
System.Windows.Media.Drawing
System.Windows.Media.Visual
}}}
تم الشكر بواسطة:
#2
الرسم باستخدام Shapes :

تقع جميع الاشكال تحت الفئة System.Windows.Shapes ، نبدأ بابسط مثال لرسم مستطيل مثلاً :


كود :
[FONT=Tahoma]<Rectangle Height="100" Width="200" Stroke="Red"
StrokeThickness="2" Fill="Aqua" />[/FONT]


الناتج سيكون بالشكل التالي :


الأشكال التي يمكنك رسمها يمكنك الوصول إليها عن طريق Object Browser بالشكل التالي مثلاً :


ويمكننا التعرف على الخصائص التي يمكن ان نجدها لأي شكل منهم ، الشكل التالي كمثال :


كما يمكنك التعرف على الخصائص العامة لل shapes الموجودة في الصورة التالية مثلاً :
}}}
تم الشكر بواسطة:
#3
خصائص القلم Pen :

يتم تعريف القلم المستخدم في اي عملية رسم بالصورة التالية مثلاً :

كود :
[color=#000080]<Pen Thickness=[COLOR=#0000ff]"10"[/color] LineJoin=[color=#0000ff]"Round"[/color] EndLineCap=[color=#0000ff]"Triangle"[/color] StartLineCap=[color=#0000ff]"Round"[/color] />[/COLOR]

شبيه جداً لو لاحظت بما تعلمناه في GDI+ .

خصائص الفرشاة Brush :

هناك عدة انوع من الفرش يمكن استخدامها في تطبيقاتك ، منها :

DrawingBrush : تلوين عادي .
ImageBrush : تلوين جزء من الشكل بجزء من صورة .
LinearGradientBrush : تدرج خطي لعدة الون .
RadialGradientBrush : تدرج دائري لعدة الوان .
SolidColorBrush : فرشاة للون واحد فقط .


ابسط مثال عليها هي الفرشاة Solid بلون واحد فقط :

كود :
[color=#000080]<Ellipse Height ="50" Width ="50">[/color]
[color=#000080]<Ellipse.Fill>[/color]
[color=#000080]<SolidColorBrush Color ="Aqua"/>[/color]
[color=#000080]</Ellipse.Fill>[/color]
[color=#000080]</Ellipse>[/color]


مثال باستخدام RadialGradientBrush للتدرج الدائري :


كود :
[color=#000080]<Ellipse Width ="75" HorizontalAlignment=[COLOR=#0000ff]"Left"[/color] Margin=[color=#0000ff]"28,30,0,96"[/color]>[/COLOR]
[color=#000080]<Ellipse.Fill>[/color]
[color=#000080]<RadialGradientBrush GradientOrigin=[COLOR=#0000ff]"0.5,0.5"[/color]
Center="0.5,0.5" RadiusX=[color=#0000ff]"0.5"[/color] RadiusY=[color=#0000ff]"0.5"[/color]>[/COLOR]

[color=#000080]<GradientStop Color=[COLOR=#0000ff]"Yellow"[/color] Offset=[color=#0000ff]"0"[/color] />[/COLOR]
[color=#000080]<GradientStop Color=[COLOR=#0000ff]"Red"[/color] Offset=[color=#0000ff]"0.25"[/color] />[/COLOR]
[color=#000080]<GradientStop Color=[COLOR=#0000ff]"Blue"[/color] Offset=[color=#0000ff]"0.75"[/color] />[/COLOR]
[color=#000080]<GradientStop Color=[COLOR=#0000ff]"LimeGreen"[/color] Offset=[color=#0000ff]"1"[/color] />[/COLOR]
[color=#000080]</RadialGradientBrush>[/color]
[color=#000080]</Ellipse.Fill>[/color]
[color=#000080]</Ellipse>[/color]


وأخيراً مثال لطباعة جزء من صورة داخل شكل :

كود :
[color=#000080]<Rectangle Height ="100" Width ="300">[/color]
[color=#000080]<Rectangle.Fill>[/color]
[color=#000080]<ImageBrush>[/color]
[color=#000080]<ImageBrush.ImageSource>[/color]
[color=#000080]<BitmapImage UriSource ="pic.JPG"/>[/color]
[color=#000080]</ImageBrush.ImageSource>[/color]
[color=#000080]</ImageBrush>[/color]
[color=#000080]</Rectangle.Fill>[/color]
[color=#000080]</Rectangle>[/color]


ناتج من موقع مايكروسوفت لاستخدامات الفرش المختلفة :


وهذا الرابط لمزيد من التفاصيل .
http://msdn.microsoft.com/en-us/library/aa970904.aspx


نواصل في الدرس القادم ....
}}}
تم الشكر بواسطة:
#4
ال Transformations :

ستفيدك كثيراً هذه الخصائص في حالة برمجة العناصر المتحركة او المتأثرة بمدخلات المستخدم ، حيث يمكنك تحريك الأشكال وتدويرها وعكسها وخلافه من العمليات المعروفة .
المثال التالي يوضح بعض التأثيرات على مجموعة من الأدوات الموجودة لدينا في الفورم :


كود :
[color=#000080]<Button Height=[COLOR=#0000ff]"23"[/color] Margin=[color=#0000ff]"72,72,0,0"[/color] Name=[color=#0000ff]"button1"[/color] VerticalAlignment=[color=#0000ff]"Top"[/color] HorizontalAlignment=[color=#0000ff]"Left"[/color] Width=[color=#0000ff]"75"[/color]>[/COLOR]Button
[color=#000080]<Button.RenderTransform>[/color]
[color=#000080]<SkewTransform AngleX ="30" AngleY ="20"/>[/color]
[color=#000080]</Button.RenderTransform>[/color]

[color=#000080]</Button>[/color]
[color=#000080]<TextBox Margin=[COLOR=#0000ff]"142,11,59,0"[/color] Name=[color=#0000ff]"textBox1"[/color] Height=[color=#0000ff]"23"[/color] VerticalAlignment=[color=#0000ff]"Top"[/color]>[/COLOR]Ahmed
[color=#000080]<TextBox.RenderTransform>[/color]
[color=#000080]<TransformGroup>[/color]
[color=#000080]<SkewTransform AngleX ="20" AngleY ="20"/>[/color]
[color=#000080]<RotateTransform Angle ="45"/>[/color]
[color=#000080]<SkewTransform AngleX ="5" AngleY ="20"/>[/color]
[color=#000080]</TransformGroup>[/color]
[color=#000080]</TextBox.RenderTransform>[/color]
[color=#000080]</TextBox>[/color]


وهذه صورة للناتج :


على هذا الرابط تطبيق جميل جداً للتأثير بصور مختلفة على اي شكل :
http://www.codeproject.com/KB/WPF/TransformationsIntro.aspx

هذه صورة التطبيق :

}}}
تم الشكر بواسطة:
#5
ال Animation في WPF :

تقع كافة الخصائص والدوال المتعلقة بعمليات التحريك وال Animation تحت الفئة System.Windows.Media.Animation ، اي حركة تحصل لأي اداة لديك لا بد لها من ثلاث خصائص : From ، To ، By : حيث تحدد نقطة البداية والنهاية والخاصية التي يتم فيها التحريك ، وهو ما سنتعرف عليه لاحقاً ...

ولأي حركة هناك ايضاً timeline ، اهم عناصره هي :

AccelerationRatio, DecelerationRatio : للتحكم في سرعة الحركة .
AutoReverse : للعودة للخلف بعد انتهاء الحركة .
BeginTime This : الوقت الذي تبدأ بعده الحركة ، القيمة 0 تعني البدء المباشر .
Duration : الفترة التي تستغرقها عملية الحركة .
FillBehavior, RepeatBehavior : تحديد ماذا سيحدث بعد انتهاء الحركة سواء الاعادة أو خلافه .


مثال ، تغيير حجم الخط في Label :
C#:

كود :
DoubleAnimation dblAnim = new DoubleAnimation();
dblAnim.From = 10;
dblAnim.To = 30;
label1.BeginAnimation(Label.FontSizeProperty, dblAnim);

vb.net:

كود :
Dim dblAnim As New DoubleAnimation()
dblAnim.From = 10
dblAnim.[To] = 30
label1.BeginAnimation(Label.FontSizeProperty, dblAnim)


بداية الحركة :


نهاية الحركة :


يمكن تحديد مدة الحركة بالشكل التالي مثلاً :


كود :
[FONT=Tahoma]dblAnim.Duration = new Duration(TimeSpan.FromSeconds(4)) ;[/FONT]

ولعكس الحركة بعد الانتهاء :



كود :
[FONT=Tahoma]dblAnim.AutoReverse = true;[/FONT]


ويمكننا تحديد اعادة العرض بعد انتهاءه :

كود :
[FONT=Tahoma]dblAnim.RepeatBehavior = RepeatBehavior.Forever;[/FONT]


او اعادته لاربع مرات مثلاً :


كود :
[FONT=Tahoma]dblAnim.RepeatBehavior = new RepeatBehavior(4);
[/FONT]
}}}
تم الشكر بواسطة:
#6
الحركة باستخدام XAML :

كما اتفقنا منذ اللحظة الأولى لدروسنا لهذا الاسبوع ، انه بالامكان تطبيق اي من الاوامر عن طريق XAML او عن طريق الكود كون جميع هذه الخصائص يمكن الوصول إليها من الكود والعكس ، الآن لدينا مثال حول جعل Button يقوم بالدوران حول نفسه في حالة الضغط عليه بالماوس - من كتاب Pro CSharp 2008 :


كود :
[color=#000080]<Button Name=[COLOR=#0000ff]"myAnimatedButton"[/color] Width=[color=#0000ff]"120"[/color] Height = "40"
RenderTransformOrigin="0.5,0.5" Content = "OK">[/COLOR]
[color=#000080]<Button.RenderTransform>[/color]
[color=#000080]<RotateTransform Angle=[COLOR=#0000ff]"0"[/color]/>[/COLOR]
[color=#000080]</Button.RenderTransform>[/color]
[i][color=#000080]<!-- The animation is triggered when the button is clicked -->[/color][/i]
[color=#000080]<Button.Triggers>[/color]
[color=#000080]<EventTrigger RoutedEvent=[COLOR=#0000ff]"Button.Click"[/color]>[/COLOR]
[color=#000080]<BeginStoryboard>[/color]
[color=#000080]<Storyboard>[/color]
[COLOR=#000080]<DoubleAnimationUsingKeyFrames
Storyboard.TargetName="myAnimatedButton"
Storyboard.TargetProperty=
"(Button.RenderTransform).(RotateTransform.Angle)"
Duration="0:0:2" FillBehavior=[color=#0000ff]"Stop"[/color]>[/COLOR]
[color=#000080]<DoubleAnimationUsingKeyFrames.KeyFrames>[/color]
[color=#000080]<LinearDoubleKeyFrame Value=[COLOR=#0000ff]"360"[/color] KeyTime=[color=#0000ff]"0:0:1"[/color] />[/COLOR]
[color=#000080]<DiscreteDoubleKeyFrame Value=[COLOR=#0000ff]"180"[/color] KeyTime=[color=#0000ff]"0:0:1.5"[/color] />[/COLOR]
[color=#000080]</DoubleAnimationUsingKeyFrames.KeyFrames>[/color]
[color=#000080]</DoubleAnimationUsingKeyFrames>[/color]
[color=#000080]</Storyboard>[/color]
[color=#000080]</BeginStoryboard>[/color]
[color=#000080]</EventTrigger>[/color]
[color=#000080]</Button.Triggers>[/color]
[color=#000080]</Button>[/color]
}}}
تم الشكر بواسطة:
#7
تعريف styles :

إذا كنت قد جربت سابقاً اي نوع من برمجة الويب كنت ستعرف ان لدينا ما يعرف باسم styles وهي مجموعة من الخصائص تحدد الطول والعرض والالوان وخلافه تحت مسمى مثلاً darkstyle ، بحيث يمكن بعد ذلك استخدامها في اي اداة بكتابة اسم ال style فقط .

هذا هو ما نحتاج إليه أيضاً في ال WPF حيث اننا لن نقوم بكتابة كل هذا الحجم من التوصيف لكل زر امر مثلاً في حالة أن لدينا عدة ازرار أمر لها نفس ال style ، لذا سنقوم بتعريف style بالشكل التالي مثلاً :

كود :
[color=#000080]<Window.Resources>[/color]
[color=#800080]<Style x:Key ="darkstyle">[/color]
[color=#000080]<Setter Property ="Button.FontSize" Value ="15"/>[/color]
[color=#000080]<Setter Property ="Button.Background">[/color]
[color=#000080]<Setter.Value>[/color]
[color=#000080]<LinearGradientBrush StartPoint=[COLOR=#0000ff]"0,0"[/color] EndPoint=[color=#0000ff]"1,1"[/color]>[/COLOR]
[color=#000080]<GradientStop Color=[COLOR=#0000ff]"Black"[/color] Offset=[color=#0000ff]"0"[/color] />[/COLOR]
[color=#000080]<GradientStop Color=[COLOR=#0000ff]"Blue"[/color] Offset=[color=#0000ff]"0.25"[/color] />[/COLOR]
[color=#000080]<GradientStop Color=[COLOR=#0000ff]"Brown"[/color] Offset=[color=#0000ff]"1"[/color] />[/COLOR]

[color=#000080]</LinearGradientBrush>[/color]
[color=#000080]</Setter.Value>[/color]
[color=#000080]</Setter>[/color]
[color=#800080]</Style>[/color]
[color=#000080]</Window.Resources>[/color]


والآن لكل زر أمر يكفي التعريف بالشكل التالي :


كود :
[color=#000080]<Button Name=[COLOR=#0000ff]"b1"[/color] Width = "100"
Style ="{StaticResource darkstyle}" Content = "Button 1" HorizontalAlignment=[color=#0000ff]"Right"[/color] Margin=[color=#0000ff]"0,61,30,61"[/color] />[/COLOR]
[color=#000080]<Button Name=[COLOR=#0000ff]"b2"[/color] Width = "100"
Style ="{StaticResource darkstyle}" Content = "Button 2" HorizontalAlignment=[color=#0000ff]"Left"[/color] Margin=[color=#0000ff]"25,61,0,61"[/color] />[/COLOR]

الناتج سيكون بالشكل التالي :

}}}
تم الشكر بواسطة:
#8
تغيير طبيعة ال style

يمكنك تعريف اشياء مخصصة لتغيير الموجود في ال style المستخدم ، مثلاً لتحديد زر امر حجم الخط ولونه فيه مختلف لا يلزم تغيير ال style بالكامل بل يكفي كتابته بالشكل التالي :

كود :
[color=#000080]<Button Name=[COLOR=#0000ff]"b2"[/color] Width = "100"
Style ="{StaticResource darkstyle}" Content = "Button 2" HorizontalAlignment=[color=#0000ff]"Left"[/color] Margin=[color=#0000ff]"25,61,0,61"[/color] FontSize=[color=#0000ff]"30"[/color] />[/COLOR]


والناتج :


اشتقاق Style من آخر :

لعمل style جديد يتم أخذه من style قديم يمكن كتابة تعريفه بالشكل التالي :

كود :
[color=#800080]<Style x:Key ="darkredstyle" BasedOn = "{StaticResource darkstyle}">[/color]
}}}
تم الشكر بواسطة:
#9
تصميم style باستخدام Triggers .

يمكنك ال Triggers من تحديد حالات للاداة مرتبطة بحدث مرور الماوس او غيره ، فمثلاً لتلوين مربع نص بلون مختلف عند حصوله على التحديد نكتب style بالشكل التالي :


كود :
[color=#000080]<Window.Resources>[/color]
[color=#800080]<Style x:Key ="txtstyle" TargetType = "{x:Type TextBox}">[/color]
[color=#000080]<Setter Property = "Background" Value = "White"/>[/color]

[color=#000080]<Style.Triggers>[/color]
[color=#000080]<Trigger Property = "IsFocused" Value = "True">[/color]
[color=#000080]<Setter Property = "Background" Value = "Yellow"/>[/color]
[color=#000080]</Trigger>[/color]
[color=#000080]</Style.Triggers>[/color]
[color=#800080]</Style>[/color]
[color=#000080]</Window.Resources>[/color]


والناتج لمربع النص الذي عليه التحديد :


برمجياً :

مثال منقول من Pro CSharp 2008 ، اضافة عناصر للقائمة بها مجموعة من ال styles ومن ثم تحديد style زر الامر ليحتوي على أحدها بالشكل التالي مثلاً :

كود :
[FONT=Tahoma]public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
// Add items to our list box.
lstStyles.Items.Add("TiltStyle");
lstStyles.Items.Add("GreenStyle");
lstStyles.Items.Add("MouseOverStyle");
}
protected void comboStyles_Changed(object sender, RoutedEventArgs args)
{
// Get the selected style name from the list box.
System.Windows.Style currStyle = (System.Windows.Style)
FindResource(lstStyles.SelectedValue);
// Set the style of the button type.
this.btnMouseOverStyle.Style = currStyle;
}
}[/FONT]


والناتج :
}}}
تم الشكر بواسطة:
#10
ال Templates :

تستخدم ايضاً لتغيير خصائص الأدوات ، ولكن الفارق بينها وبين styles انها تستطيع ان تلغي بالكامل الطبيعة الاساسية للأداة ، مثلاً هذه ال Templates :


كود :
[color=#000080]<Grid.Resources>[/color]
[i][color=#000080]<!-- A simple template for a round button for items in this grid -->[/color][/i]
[color=#000080]<ControlTemplate x:Key ="roundButtonTemplate" TargetType ="{x:Type Button}">[/color]
[color=#000080]<Grid>[/color]
[color=#000080]<Ellipse Name ="OuterRing" Width ="75" Height ="75" Fill ="DarkGreen"/>[/color]
[color=#000080]<Ellipse Name ="InnerRing" Width ="60" Height ="60" Fill ="MintCream"/>[/color]
[color=#000080]<ContentPresenter HorizontalAlignment=[COLOR=#0000ff]"Center"[/color]
VerticalAlignment="Center"/>[/COLOR]
[color=#000080]</Grid>[/color]
[color=#000080]</ControlTemplate>[/color]
[color=#000080]</Grid.Resources>[/color]


والآن يمكنك تحديدها لزر أمر مثلاً :

كود :
[COLOR=#000080]<Button Name ="myButton" Foreground ="Black" FontSize ="20" FontWeight ="Bold"
Template ="{StaticResource roundButtonTemplate}"
Click ="myButton_Click">[/COLOR] Click!
[color=#000080]</Button>[/color]


والناتج :


حلقتنا القادمة ستكون مقدمة عن WPF 3D ...

والله الموفق ...
والسلام عليكم ورحمة الله وبركاته .
}}}
تم الشكر بواسطة:



التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم