بسم الله الرحمن الرحیم
یه کنترلی بنام ShapeTextButton که از نوع Button هست ، طراحی شد که توسط تمپلیت ای که براش طراحی شد ، قابلیت تعریف شکل برای 4 حالتِ عادی ، رویداد MouseEnter ، رویداد MouseClick و زمانی که کنترل غیر فعال بشه (توسط برنامه نویس) را داره .
** دقت کنید که این کلاس ، مستقلا درون خودش ، چیزی رسم نمیکنه و باید با تمپلیت ای که براش نوشته شد ، استفاده بشه تا رسم مورد نظر ، انجام بشه .
** این کلاس ، به همراه بقیه ی چیزهای مربوطه و به همراه تمپلیت و استایل های مربوطه را میتونید از فایل پیوستی در این پست ، دانلود کنید .
تصاویر :
ShapeTextButton 3.PNG
ShapeTextButton 4.PNG
ShapeTextButton 5.PNG

تنظیمات پروپرتی ها :
1) پروپرتی هایی که با نامِ ButtonShape ختم میشن ، پروپرتی هایی از نوع System.Windows.Shapes.Path هستن که شکلِ کنترل را در یکی از اون 4 حالت (که در خط بالا توضیح داده شد) ، مشخص میکنند :
الف) پروپرتی DefaultButtonShape : شکل پیش فرض را مشخص میکنه . مقداردهی این پروپرتی ، برای رسم شکل اولیه ، الزامی هست .
ب) پروپرتی MouseEnterButtonShape : شکل ، برای زمانی که موسِ کاربر ، روی این کنترل قرار میگیره را مشخص میکنه .
ج) پروپرتی MouseDownButtonShape : شکل ، برای زمانی که کاربر روی این کنترل کلیک کرد را مشخص میکنه .
د) پروپرتی ControlDisabledButtonShape : شکل ، برای زمانی که کنترل غیر فعال شد را مشخص میکنه .
2) پروپرتی هایی که با نام ContentBrush ختم میشن ، پروپرتی هایی از نوع System.Windows.Media.Brush هستن که بِراش و قلم مو ، در صورتی که پروپرتیِ Content (این پروپرتی ، باید مقدار String داده بشه که در قسمت "نکته ها" ، در زیر ، توضیح داده شد) مقداردهی شده باشه را در حالت ها و رویدادهای مختلف ، مشخص میکنند :
الف) پروپرتی MouseEnterContentBrush : بِراش و قلمو ی Content برای زمانی که موس کاربر ، روی این کنترل قرار میگیره را مشخص میکنه .
ب) پروپرتی MouseDownContentBrush : بِراش و قلمو ی Content برای زمانی که کاربر روی این کنترل کلیک کرد را مشخص میکنه .
ج) پروپرتی ControlDisabledContentBrush : بِراش و قلمو ی Content برای زمانی که این کنترل غیر فعال شد را مشخص میکنه .
3) پروپرتی GetContentBrush_ForWhichButtonShapeProperty : که از نوع اینامِ ButtonShapeProperty هست (این enum ، ساخته شده و درون فایل پیوستی در پست زیر قرار داره) ، مشخص میکنه که اگه کاربر قصد داره از Brush ها و قلم موهایی که برای تعیین متن استفاده میشه ، از همین قلم موها هم برای کدوم یک از پروپرتی های مربوط به ButtonShape (که از نوع Path بودند) ، استفاده بشه یا استفاده نشه (مقدار ButtonShapeProperty.None) تا با تعیین این پروپرتی ، نیازی نباشه که از قلم موهایی که در پروپرتی های ButtonShape تعیین میشه ، استفاده بشه
تا به این ترتیب ، کار برای Style دهی برای تعیین قلم موها برای پروپرتی های ButtonShape ، آسون تر بشه و هم اینکه قلم موهای Content و ButtonShape (در صورت نیاز و تمایل) ، از یک قلم مو استفاده کنند .
طریقه ی استفاده :
اول ، فایل های مربوطه که در این پست پیوست شده را به پروژه اضافه کنید (فایل های ShapeTextButton.cs و ButtonShapeProperty.cs و ShapeTextButtonStyle.xaml و ShapeTextButtonTemplate.xaml را به پروژه اضافه کنید) .
فضای نام زیر را به پروژه اضافه کنید :
xmlns:CustomControls ="clr-namespace:PoshtibangirTolo.Elements.CustomControls "
کد زیر را (برای الحاق فایل های تمپلیت و استایل) درون Application.Resources اضافه کنید :
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="ShapeTextButtonTemplate.xaml"/> <ResourceDictionary Source="ShapeTextButtonStyle.xaml"/> </ResourceDictionary.MergedDictionaries> </ResourceDictionary>
مثال :
<CustomControls:ShapeTextButton x:Name="CloseButton" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="10" Width="24" Height="24"
GetContentBrush_ForWhichButtonShapeProperty="Strok e" DefaultButtonShape="{DynamicResource CloseShape}" MouseEnterButtonShape="{DynamicResource CloseShape}" MouseDownButtonShape="{DynamicResource CloseShape}" ControlDisabledButtonShape="{DynamicResource CloseShape}">
<CustomControls:ShapeTextButton.Resources> <Path x:Key="CloseShape" Data="M2,2 L22,22 M22,2 L2,22" StrokeThickness="3" StrokeStartLineCap="Triangle" StrokeEndLineCap="Triangle"/> </CustomControls:ShapeTextButton.Resources> </CustomControls:ShapeTextButton>
نکته ها :
1) موقع نوشتن این تمپلیت برای این کنترل ، فرض فقط بر این گذاشته شد که کاربر ، نوع پروپرتیِ Content را اگه قرار هست که مقداردهی کنه ، فقط از نوع String مقداردهی کنه (تا مجددا پروپرتی ای مجزا برای متن برای این کلاس در نظر گرفته نشه) .پس حتما دقت کنید که برای این کنترلِ ShapeTextButton ، اگه پروپرتیِ Content را میخواید مقداردهی کنید ، مقدارش را فقط از نوع String مشخص کنید .
2) دقت کنید که با قرار دادنِ مقدار ButtonShapeProperty.None برای پروپرتیِ GetContentBrush_ForWhichButtonShapeProperty (که بصورت پیش فرض هم همین مقدار را داره) ، باید بصورت جداگانه ، برای هر کدوم از پروپرتی هایی که با نام ButtonShape ختم میشن ، مقدار پروپرتی Fill یا Stroke (یا هر دو) را حتما تعیین کنید .
و برعکس ، اگه مقداری بجز ButtonShapeProperty.None را برای اون پروپرتی مشخص کنید ، پروپرتی Fill یا Stroke (یا هر دو که بسته به نوع انتخاب مقدار پروپرتی GetContentBrush_ForWhichButtonShapeProperty داره) را اگه برای پروپرتی هایی که با نام ButtonShape ختم میشن ، مقداردهی کنید ، چون از مقادیر و قلم موهایی که برای پروپرتی هایی که با نام ContentBrush ختم میشن ، استفاده میشه ، پس تعیین مقدارشون ، هیچ تاثیری نخواهد داشت .
3) بصورت پیش فرض ، پروپرتیِ Focusable ئه این کنترل ، غیر فعال هست که برای فوکوس کردن روی این کنترل ، باید فعال اش کنید .
همچنین علاوه بر فعال کردن پروپرتیِ Focusable ، برای اینکه زمانی که روی کنترل فوکوس میشه ، تغییر شکل کنترل دیده بشه (و به اون شکل ، تغییر کنه) ، باید پروپرتیِ MouseEnterButtonShape را هم مقداردهی کنید .
*** به نیت حضرت ولی عصر (عج) و برای اموات خودمون و خودتون ، یه فاتحه بگیرین ، ممنون میشم .
*** با تشکر ویژه از استادم (The King) که کمک بسیار زیادی بهم کردن .