WPF مخفف Windows Presentation Foundation است که برای ایجاد رابط کاربری(UI) برای برنامه های دسکتاپ مورد استفاده قرار می گیرد. WPF علاوه بر این که مانند Windows Form قابلیت کشیدن و انداختن کنترل ها روی فرم ها را دارد، ویژگی های جدیدی مانند رابط کاربری غنی، انیمیشن و موارد دیگر را برای افزایش سرعت توسعه ارائه میدهد. یک موتور گرافیکی دو بعدی و سه بعدی است. به طور خلاصه کارهای زیر را می توان با استفاده از WPF انجام داد: - می تواند کنترل ها و گرافیک های معمولی ایجاد کند. - می تواند به راحتی فایل های صوتی و تصویری را بارگذاری / پخش کند. - می تواند جلوه های گرافیکی نرم مانند سایه ها(Shadows) و گرادیان رنگ(Color Gradients) را ارائه دهد. - می تواند از استایل های مشترک در کنترل های یکسان برای ارائه تم، پوسته و طرح یکسان استفاده کند. - می تواند فرم اشیاء از جمله اشکال، کنترل ها و ویدئو را تغییر دهد. - می تواند گرافیک های سه بعدی متحرک ایجاد کند. - میتواند به راحتی گرافیکهای برداری ترسیم کند.
دو نوع از اسناد پشتیبانی شده توسط Windows Presentation Foundation (WPF) اسناد Flow Fromat و Fix Fromat هستند. سند Flow Fromat محتوا را متناسب با اندازه صفحه تغییر می دهد در حالی که سند Fix Fromat محتوا را بدون توجه به اندازه صفحه نمایش می دهد.
فضای نام مورد نیاز برای کار با 3D در System.Windows.Media.Medi3D است.
خیر ، WPF هرگز نمی تواند جایگزین DirectX شود. WPF نمی تواند برای ایجاد بازی با گرافیک خیره کننده استفاده شود. WPF جایگزین فرم Windows است ، نه DirectX.
به Property هایی که متعلق به یک کلاس خاص هستند اما می توانند برای دیگری استفاده شوند ، Dependancy Property می گویند.
یک شی ای که حالت آن قفل شده است به طوری که تغییر ناپذیر می شود ، به عنوان یک شی Freezable شناخته می شود. چنین اشیائی عملکرد بهتری دارند. همچنین اگر آنها نیاز به اشتراک گذاری بین Therad ها داشته باشند ، ایمن تر است.
WPF یک فناوری جدیدتر است و بنابراین دارای جدیدترین ابزارهای توسعه است. این برنامه طیف گسترده ای از زبان های برنامه نویسی را پشتیبانی می کند و از قابلیت استفاده مجدد قوی برخوردار است.
یکی از تفاوت های عمده این است که دات نت برای اجرای برنامه های مرورگر WPF بر روی سرویس گیرنده مورد نیاز است. اما Silverlight فقط با استفاده از افزونه اجرا می شود. تفاوت دیگر این است که برنامه های ساخته شده در WPF به سیستم عامل بستگی دارند زیرا دات نت فقط در ویندوز اجرا می شود. از سوی دیگر ، افزونه Silverlight را می توان در سیستم عامل هایی که ویندوز نیستند نیز نصب کرد.
PRISM چارچوبی برای ایجاد برنامه های پیچیده برای WPF ، Silverlight یا Windows Phone است. PRISM از MVVM ، IC ، Command Pattern ، DI و Sepration of Concerns برای Losse Coupling استفاده می کند.
بله ، Windows From را می توان در WPF استفاده کرد. Windows From می تواند به صورت یک WPF pop ظاهر شود. با استفاده از کنترل WindowsFormsHost که از قبل نصب شده است ، کنترل های ویندوز فرم می تواند در کنار کنترل های WPF در یک صفحه قرار بگیرد.
CustomControl عملکرد کنترل های موجود را گسترش می دهد و شامل یک استایل پیش فرض در Themes/Generic.xaml و یک فایل کد می باشد. این بهترین راه برای ایجاد یک کتابخانه کنترل است و همچنین می تواند به استایل یا نمپلیت تبدیل شود.
Pass Animation یک نوع انیمیشن است که در آن شی متحرک مسیری را طی می کند که توسط هندسه مسیر تعیین شده است.
بله ، برنامه های WPF را می توان بدون XAML ایجاد کرد ، زیرا استفاده از XAML در WPF یک امر انتخابی است.
WPF دارای سه نوع پنجره است: پنجره عادی Page Window Navigate Window
مرتب سازی را می توان با استفاده از ویژگی ItemsCollection انجام داد. ItemsCollection حاوی یک ویژگی به نام SortDescription است که نمونه های System.ComponentModel.SortDescription را در خود نگه می دارد. هر نمونه SortDescription نحوه مرتب سازی عناصر را مشخص می کند و نشان می دهد که مرتب نزولی یا صعودی است. به عنوان مثال ، این کد عناصر ContentControl را بر اساس ویژگی تعداد کلمات آنها طبقه بندی می کند: myItemsControl.Items.SortDescription.Add (new SortDescription ("WordCount" ، ListSortDirection.Descending)) ؛
MVC مخفف Model-View Controller و MVVM مخفف Model-View ViewModel است. در MVVM، ما از ViewModel به جای Controller استفاده می ;kdl. این View Model در زیر لایه UI وجود دارد و مسئول فراهم نمودن داده های مورد نیاز View است. مانند یک شیء container عمل می کند که View اعمال و داده های خود را از آن دریافت می کند.
هر زمان که الزامی برای ایجاد رابط کاربری سفارشی ایجاد شود ، استفاده می شود و یک کلاس برای طراحی است که دستورالعمل هایی برای ساخت یک شی می دهد. این دستورالعمل ها شامل Opacity و غیره میشوند. کلاس Visual همچنین عملکرد کلاسهای مدیریت شده WPF و MilCore.dll را تقویت می کند.
- Stack Panel - Grid Panel - Canvas Panel - Dock Panel - Wrap Panel
Attached Property اساساً همان Dependency Property است که امکان پیوست یک مقدار را به هر شی تصادفی می دهد.
InotifyPropertyChanged به کلاینت در مورد تغییر مقدار یک Property بایند شده اطلاع می دهد. یک رویداد به نام PropertyChanged وجود دارد که هر زمان که یک Property از شیء Model تغییر می کند ، اجرا میشود.
Command ها قدرتمندتر و مفیدتر از Event ها هستند. Action ها عمیقاً با منبع Event مرتبط هستند و بنابراین نمی توان از Event ها به راحتی استفاده مجدد کرد. اما Command این امکان را فراهم می کند که چندین Action را به طور موثر در یک مکان حفظ کرده و سپس طبق نیاز خود از آنها مجدداً استفاده کنیم.
الگوی MVVM کد UI را به 3 قسمت اصلی تقسیم می کند: Model -مجموعه ای از کلاس ها را نشان می دهد که شامل داده های دریافت شده از پایگاه های داده است. View - کدی است که برای نمایش بصری داده ها. ViewModel - لایه ای است که View و Model را به هم متصل می کند. داده ها را به روشی ارائه می دهد که درک آن آسان است. همچنین نحوه تعامل View با برنامه را کنترل می کند.
Layout Pannel مورد نیاز است تا کنترل ها روی صفحه نمایش هایی با اندازه های مختلف یا اندازه فونت های مختلف درست قرار بگیرند. اگر ما کنترل ها را روی مختصات پیکسلی قرار دهیم ، در صورت انتقال به یک محیط دیگر ، این مدل از کار می افتد. به همین دلیل ، Layout Pannel ها ضروری هستند.
UserControl کنترلهای موجود را در یک گروه قابل استفاده مجدد قرار می دهد. شامل یک فایل XAML و یک کد است و UserControl را نمی توان به style یا template تبدیل کرد.
به فرایند تبدیل یک شی به آرایه ای از بایت ها Serialization گفته میشود.
Silverlight و WPF از این نظر مشابه هستند که هر دو از XAML استفاده می کنند و کد، نحو و کتابخانه های یکسانی را به اشتراک می گذارند.
XAML مخفف eXtensible Application Markup Language است. زبانی است که برای نمونه سازی اشیاء NET. استفاده می شود. این زبان توسط مایکروسافت برای نوشتن رابط کاربری برای برنامه های نسل بعدی توسعه یافته است. XML برای ذخیره داده ها یا کار با داده های ذخیره شده طراحی شده است ، در حالی که XAML نسخه توسعه یافته XML است که برای برنامه نویسی NET. استفاده می شود.
Resource ها به ما توانایی ذخیره سازی دادهها به عنوان یک منبع می دهند که به صورت محلی، برای یک کنترل یا کل پنجره و یا در سطح عمومی، برای کل برنامه قابل استفاده است. دادهها اغلب اوقات میتوانند آنچه میخواهید باشند، از اطلاعات واقعی گرفته تا سلسله مراتب کنترلهای WPF. در واقع این قابلیت به شما امکان میدهد دادهها را در یک مکان قرار داده و در چند مکان دیگر استفاده کنید، که بسیار مفید است. با استفاده از ویژگی x:Key، به منابع یک کلید داده میشود که به شما امکان میدهد با استفاده از این کلید در ترکیب با قابلیت نشانه گذاری StaticResource، از سایر قسمتهای برنامه به آن منبع ارجاع دهید. در مثال زیر، فقط یک رشته سادهی متنی ذخیره شده است و سپس در دو کنترل مختلف TextBlock از آن رشته استفاده شده است.
<Window x:Class="WpfTutorialSamples.WPF_Application.ResourceSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
Title="ResourceSample" Height="150" Width="350">
<Window.Resources>
<sys:String x:Key="strHelloWorld">Hello, world!</sys:String>
</Window.Resources>
<StackPanel Margin="10">
<TextBlock Text="{StaticResource strHelloWorld}" FontSize="56" />
<TextBlock>Just another "<TextBlock Text="{StaticResource strHelloWorld}" />" example, but with resources!</TextBlock>
</StackPanel>
</Window>
این سوال از من پرسیده شده است  + 
دو نوع ترازبندی محتوا در WPF وجود دارد: HorizontalContentAlignment VerticalContentAlignment این هر دو ویژگی در کلاس System.Windows.Controls.Control تعریف شده است که کلاس اصلی همه کنترل ها در WPF است.
از ValueConverter برای بایند کردن داده در زمانی استفاده می شود نوع داده ارسالی شما با نوع مورد انتظار متفاوت است. به عنوان مثال شما میخواهید یک CheckBox را بر اساس یک مقدار علامت بزنید، اما مقدار به جای مقدار بولی، رشتهای مانند «بله» یا «نه» است. یا اینکه شما یک TextBox و یک Button دارید و می خواهید هنگامی که متن TextBox پر/خالی است Button را فعال/غیرفعال کنید. در این حالت شما باید داده های رشته را به بولی تبدیل کنید. این امر با استفاده از Value Converer امکان پذیر است. برای پیاده سازی Value Converter ، باید از IValue Converter در فضای نام System.Windows.Data ارث بری کرده و متدهای Convert و Convert Back پیاده سازی کنید. در مثال زیر می خواهیم یک Converter ساده را پیاده سازی کنیم که یک رشته را به عنوان ورودی می گیرد و سپس یک مقدار بولی را برمی گرداند، و همچنین برعکس.
<Window x:Class="WpfTutorialSamples.DataBinding.ConverterSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfTutorialSamples.DataBinding"
Title="ConverterSample" Height="140" Width="250">
<Window.Resources>
<local:YesNoToBooleanConverter x:Key="YesNoToBooleanConverter" />
</Window.Resources>
<StackPanel Margin="10">
<TextBox Name="txtValue" />
<WrapPanel Margin="0,10">
<TextBlock Text="Current value is: " />
<TextBlock Text="{Binding ElementName=txtValue, Path=Text, Converter={StaticResource YesNoToBooleanConverter}}"></TextBlock>
</WrapPanel>
<CheckBox IsChecked="{Binding ElementName=txtValue, Path=Text, Converter={StaticResource YesNoToBooleanConverter}}" Content="Yes" />
</StackPanel>
</Window>
*Code Behind
public class YesNoToBooleanConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
switch(value.ToString().ToLower())
{
case "yes":
return true;
case "no":
return false;
}
return false;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if(value is bool)
{
if((bool)value == true)
return "yes";
else
return "no";
}
return "no";
}
}
این سوال از من پرسیده شده است  + 
- ماژولار بودن - رویکرد آزمون محور - جداسازی UI و لایه Business به عنوان مدل View و View Model. - به اشتراک گذاری کد بین صفحات و فرم ها. - نگه داری ساده
در WPF عمدتا دو نوع Resource وجود دارد: - Static Resource: - Dynamic Resource: تفاوت اصلی این است که منبع استاتیک(Static Resource) فقط یک بار خوانده میشود، و آن هنگامی است که XAML بارگیری میگردد. اگر بعد از آن منبع تغییر کند، تغییرات در جایی که شما از StaticResource استفاده کردهاید منعکس نمیشوند. از سوی دیگر، DynamicResource یک بار زمانی که مورد نیاز است خوانده میشود، سپس هنگام اعمال تغییر در منبع، دوباره خوانده میشود. در کد زیر دو مثال داریم. اولی برای Static Resource و دومی برای Dynamic Resource. همانطوری که در مثال دوم می بینید، با کلیک روی یک دکمه (button) میتوان محتوای منبع را تغییر داد.
Static Resource Example:
<Grid.Resources>
<SolidColorBrush x:Key="lblbgcolor" Color="Blue"/>
</Grid.Resources>
<Label Name="lbl" Margin="71,44,77,0" Background="{StaticResourcelblbgcolor}" Height="49" />
----------------------------------------------------------------------------
Dynamic Resource Example:
<Window.Resources>
<SolidColorBrush x:Key="brush" Color="Red" />
</Window.Resources>
<Button x:Name="btn" Content="Click Me" Click="Button_Click" Background="{DynamicResource brush}" Height="100" Width="100" />
*Code Behind
private void Button_Click(object sender, RoutedEventArgs e)
{
this.btn.SetResourceReference(BackgroundProperty, "brush");
}
این سوال از من پرسیده شده است  + 
ICommand جزء اصلی معماری MVVM است و وظیفه آن جداسازی واسط کاربری(UI) و منطق تجاری(Bussiness Logic) برنامه است. این بدین معناست کهدر WPF با معماری MVVM، ما کد مربوط به رویدادها را در Code Behind نمی نویسیم. ما به جای آن از روش method binding استفاده می کنیم. رابط ICommand به ما این امکان را می دهد که ویژگی Command کنترل Button را به متدی که در یک View Model تعریف شده است بایند(Bind) کنیم. برای مثال فرض کنید یک TextBox و یک Button در UI داریم. میخواهیم وقتی کاربر متنی را می نویسد و روی Button کلیک می کند، پیام در کادر نمایش داده شود. در این صورت کد مربوط به نمایش متن به جای Code Behind داخل یک متد در View Model پیاده سازی میشود. رابط ICommand دارای دو متد و یک رویداد است: - Execute(object): این متد زمانی فراخوانی می شود که یک Command راه اندازی شود. فقط یک پارامتر object دارد که می توان از آن برای اطلاعات اضافی استفاده کرد و نوع برگشتی آن void است. - CanExecute(object): این متد نیز فقط یک پارامتر object دارد، اما مقدار bool برمی گرداند. اگر مقدار true را برگرداند، به این معنی است که دستور می تواند اجرا شود. - CanExecuteChanged: این رویداد به صورت asynchronous در پسزمینه اجرا میشود، اگر منطق متد ()CanExecute تغییر کرده باشد، آن را پیگیری میکند.
public interface ICommand
{
void Execute(object parameter);
bool CanExecute(object parameter);
event EventHandler CanExecuteChanged;
}
این سوال از من پرسیده شده است  + 
Data binding فرآیند ارسال اطلاعات از یک شی به شی دیگر و نمایش آن در یک یا چند عنصر در رابط کاربری(User Interface) است. سینتکس (Syntax) کلی Binding به صورت زیر است: {Binding Path=NameOfProperty} در Path ویژگی(Property) را که میخواهید به آن متصل شوید را قرار میدهید، با این حال، از آنجایی که Path ویژگی پیشفرض یک binding است، در صورت تمایل میتوانید آن را حذف کنید، مانند این: {Binding NameOfProperty} با این حال، Binding ویژگی های بسیار دیگری دارد، یکی از آنها ElementName است که در مثال زیر استفاده کردیم و این به ما امکان می دهد که مستقیماً به عنصر UI دیگری به عنوان منبع متصل شویم. هر ویژگی که در binding تنظیم می کنیم با یک کاما از هم جدا می شود: {Binding Path=Text, ElementName=txtValue}
<Window x:Class="WpfTutorialSamples.DataBinding.HelloBoundWorldSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="HelloBoundWorldSample" Height="110" Width="280">
<StackPanel Margin="10">
<TextBox Name="txtValue" />
<WrapPanel Margin="0,10">
<TextBlock Text="Value: " FontWeight="Bold" />
<TextBlock Text="{Binding Path=Text, ElementName=txtValue}" />
</WrapPanel>
</StackPanel>
این سوال از من پرسیده شده است  + 
پنل ها یکی از مهم ترین کنترل های WPF هستند. آنها به عنوان ظرفی(Container) برای سایر کنترل ها عمل می کنند و طرح بندی(Layout) پنجره ها/صفحات شما را کنترل می کنند. از آنجایی که یک پنجره فقط می تواند یک کنترل فرزند(Child Control) داشته باشد، اغلب از یک پنل برای تقسیم فضا به قسمت هایی استفاده می شود، جایی که هر ناحیه می تواند یک کنترل یا پنل دیگری داشته باشد. انواع پنل ها به صورت زیر هستند: Canvas یک پنل ساده که این امکان را به شما می دهد تا مختصات خاصی را به هر یک از کنترل های فرزند اختصاص دهید. این نوع پنل خیلی انعطافپذیر نیست، زیرا باید کنترلهای فرزند(Child Controls) را بهصورت دستی جابهجا کنید و مطمئن شوید که آنها مطابق میل شما هستند. از آن (فقط) زمانی استفاده کنید که بخواهید کنترل کامل موقعیت کنترل فرزند را داشته باشید. WrapPanel WrapPanel هر یک از کنترلهای فرزند خود را به صورت افقی (پیشفرض) یا عمودی در کنار دیگری قرار میدهد تا جایی که دیگر فضایی وجود نداشته باشد و به خط بعدی برود. زمانی که میخواهید کنترلهارا به صورت عمودی یا افقی فهرست کنید از آن استفاده کنید. این کنترل زمانی که فضای بیشتری وجود نداشته باشد، بهطور خودکار بسته می شود. StackPanel StackPanel بسیار شبیه WrapPanel عمل می کند، اما اگر کنترل های فرزند فضای زیادی را اشغال کند، به جای بسته شدن، در صورت امکان به سادگی خود را گسترش می دهد. درست مانند WrapPanel، جهت گیری می تواند افقی یا عمودی باشد، اما به جای تنظیم عرض یا ارتفاع کنترل های فرزند بر اساس بزرگترین آیتم، عرض یا ارتفاع تنظیم می شود. زمانی که میخواهید فهرستی از کنترلها را داشته باشید که تمام فضای موجود را بدون بستهشدن اشغال کند، از StackPanel استفاده کنید. DockPanel DockPanel به شما امکان می دهد کنترل های فرزند را به بالا، پایین، چپ یا راست متصل کنید. به طور پیش فرض، آخرین کنترل، اگر موقعیت داک خاصی به آن داده نشود، فضای باقیمانده را پر می کند. شما می توانید با پانل Grid به همین نتیجه برسید، اما برای موقعیت های ساده تر، استفاده از DockPanel آسان تر خواهد بود. هر زمان که نیاز دارید یک یا چند کنترل را به یکی از طرفین متصل کنید، مانند تقسیم کردن پنجره به مناطق خاص، از DockPanel استفاده کنید. Grid Grid احتمالا پیچیده ترین و منعطف ترین نوع پنل است که می تواند شامل چندین ردیف و ستون باشد. شما یک ارتفاع برای هر یک از سطرها و یک عرض برای هر یک از ستون ها، به صورت مقدار مطلق پیکسل، درصدی از فضای موجود یا به صورت خودکار(auto) تعریف کنید که در حالت خودکار سطر یا ستون اندازه خود را بسته به محتوا تنظیم می کند. از Grid زمانی استفاده کنید که به چندین سطر و یا ستون و یا ترکیبی از پنل های دیگر نیاز دارید.
Control Template ظاهر بصری یک کنترل را تعریف می کند. همه عناصر رابط کاربری دارای نوعی ظاهر و همچنین رفتار هستند، به عنوان مثال، دکمه ظاهر و رفتار دارد. رویداد Click یا رویداد Mouse Hover ماوس رفتارهایی هستند که در پاسخ به کلیک و یا قرار گرفتن ماوس روی کنترل اتفاق می افتند و همچنین ظاهر پیشفرض دکمه وجود دارد که میتوان همه آن ها را با Control Template تغییر داد. برای مثال میتوانید با استفاده از این قابلیت شکل یک Button را از مستطیل به دایره تغییر دهید یا کاری کنید که وقتی ماوس روی Button رفت رنگ آن تغییر کند. در مثال زیر می توانید تفاوت بین یک Button معمولی با یک Button که از Control Template استفاده کرده است مشاهده کنید.
<Window x:Class = "TemplateDemo.MainWindow"
xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
Title = "MainWindow" Height = "350" Width = "604">
<Window.Resources>
<ControlTemplate x:Key = "ButtonTemplate" TargetType = "Button">
<Grid>
<Ellipse x:Name = "ButtonEllipse" Height = "100" Width = "150" >
<Ellipse.Fill>
<LinearGradientBrush StartPoint = "0,0.2" EndPoint = "0.2,1.4">
<GradientStop Offset = "0" Color = "Red" />
<GradientStop Offset = "1" Color = "Orange" />
</LinearGradientBrush>
</Ellipse.Fill>
</Ellipse>
<ContentPresenter Content = "{TemplateBinding Content}"
HorizontalAlignment = "Center" VerticalAlignment = "Center" />
</Grid>
<ControlTemplate.Triggers>
<Trigger Property = "IsMouseOver" Value = "True">
<Setter TargetName = "ButtonEllipse" Property = "Fill" >
<Setter.Value>
<LinearGradientBrush StartPoint = "0,0.2" EndPoint = "0.2,1.4">
<GradientStop Offset = "0" Color = "YellowGreen" />
<GradientStop Offset = "1" Color = "Gold" />
</LinearGradientBrush>
</Setter.Value>
</Setter>
</Trigger>
<Trigger Property = "IsPressed" Value = "True">
<Setter Property = "RenderTransform">
<Setter.Value>
<ScaleTransform ScaleX = "0.8" ScaleY = "0.8"
CenterX = "0" CenterY = "0" />
</Setter.Value>
</Setter>
<Setter Property = "RenderTransformOrigin" Value = "0.5,0.5" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Window.Resources>
<StackPanel>
<Button Content = "Round Button!"
Template = "{StaticResource ButtonTemplate}"
Width = "150" Margin = "50" />
<Button Content = "Default Button!" Height = "40"
Width = "150" Margin = "5" />
</StackPanel>
</Window>
این سوال از من پرسیده شده است  + 
یک Template نمای کلی و ظاهر بصری یک کنترل را توصیف می کند. برای هر کنترل، یک الگوی پیشفرض مرتبط با آن وجود دارد که ظاهر آن را به کنترل میدهد. در برنامه های WPF، زمانی که می خواهید رفتار بصری و ظاهر بصری یک کنترل را سفارشی کنید، می توانید به راحتی الگوهای خود را ایجاد کنید. تفاوت اصلی بین سبک ها(Styles) و الگوها(Templates) در زیر فهرست شده است: - سبکها فقط میتوانند ظاهر کنترل شما را با ویژگیهای پیشفرض(Default Properties) آن کنترل تغییر دهند. - با الگوها میتوانید به بخشهای بیشتری از یک کنترل نسبت به سبکها دسترسی داشته باشید. همچنین میتوانید رفتار موجود و جدید یک کنترل را مشخص کنید. برای مثال می توانید تعیین کنید که با کلیک بری روی یک Button و یا در رویداد Mouse Hover چه تغییر ظاهری در Button ایجاد شود. دو نوع الگو وجود دارد که بیشتر مورد استفاده قرار می گیرند: - الگوی کنترل (Control Template) - الگوی داده (Data Template)
با استفاده از استایلها، میتوانید مجموعهای از ویژگیها(Property) را مانند رنگ و سایز و ... را گروهبندی کنید و آنها را به کنترلهای خاص اختصاص دهید. یک استایل میتواند از استایل دیگری به ارث ببرد.
<Window x:Class="WpfTutorialSamples.Styles.SimpleStyleSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="SimpleStyleSample" Height="200" Width="250">
<StackPanel Margin="10">
<StackPanel.Resources>
<Style TargetType="TextBlock">
<Setter Property="Foreground" Value="Gray" />
<Setter Property="FontSize" Value="24" />
</Style>
</StackPanel.Resources>
<TextBlock>Header 1</TextBlock>
<TextBlock>Header 2</TextBlock>
<TextBlock Foreground="Blue">Header 3</TextBlock>
</StackPanel>
</Window>
این سوال از من پرسیده شده است  + 
هنگامی که یک ویژگی (Property) یا داده تغییر می کند یا یک رویداد(Event) فعال می شود، از تریگرها در استایل ها برای تغییر جلوه بصری یک عنصر WPF استفاده می شود. برای تغییر جلوه بصری یک عنصر WPF، تریگرها کد موجود در Code Behind را کاهش می دهند. تریگرها انواع مختلفی دارند: Property Trigger، Event Trigger و Data Trigger. به عنوان مثال، فرض کنید شما یک کنترل مستطیلی شکل دارید. میخواهید رنگ پسزمینه آن کنترل را زمانی که ماوس روی کنترل قرار میگیرد تغییر دهید و وقتی ماوس را ترک کرد، به حالت قبل برگردید. برای این کار باید در رویداد Mouse Hover موس و رویداد Mouse Leave از کنترل مستطیل در کلاس backend برای تغییر رنگ مستطیل مانند مثال 1 کدنویسی کنید. در این مثال، رنگ پسزمینه کنترل Rectangle را با نوشتن کد در دو رویداد مختلف پر کردهاید، اما یک تریگر با کاهش کد به رفع این مشکل کمک میکند. مثال 2 را ببینید.
Example 1
private void Rectangle_MouseMove_1(object sender, MouseEventArgs e)
{
this.rctback.Fill = Brushes.Red;
}
private void Rectangle_MouseLeave(object sender, MouseEventArgs e)
{
this.rctback.Fill = Brushes.Green;
}
------------------------------------------------------------------------
Example 2
<Rectangle Name="rctback" HorizontalAlignment="Left" Height="100" Stroke="Black" VerticalAlignment="Top" Width="100" Margin="178,92,0,0" >
<Rectangle.Style>
<Style TargetType="Rectangle">
<Setter Property="Fill" Value="Green"></Setter>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Fill" Value="Red" />
</Trigger>
</Style.Triggers>
</Style>
</Rectangle.Style>
</Rectangle>
این سوال از من پرسیده شده است  + 
سوال من خوب استسوال من خوب استسوال من خوب استسوال من خوب استسوال من خوب استسوال من خوب استسوال من خوب است
سوالی هست که اینجا نمیبینیش و از نظر تو مهمه؟ خودت سوالی داری که دنبال جوابشی؟ جواب بهتری واسه یکی از سوالای بالا داری؟ پس واسمون بفرست.
چه تفاوتی بین public ، static ...
Net. چیست؟
مزایای استفاده از NET. چیست؟
تفاوت بین Reference Type و Val...
برو به همه سوالات
#C چیست؟
تفاوت بین public ، static و vo...
constructor یا سازنده چیست؟
overloading در #C چیست؟
برو به همه سوالات