This article is currently in the process of being translated into Persian (~99% done).
The WPF Menu control
یکی از رایجترین بخشهای یک برنامه ویندوزی، منوی آن است که گاهی بعنوان منوی اصلی نیز شناخته میشود، زیرا معمولا تنها در برنامه کاربردی وجود دارد. این منو سودمند است زیرا با استفاده از فضای بسیار کم، گزینههای زیادی را ارائه میدهد، حتی اگر مایکروسافت منوی روبان (همانند آفیس) را برای جایگزینی با آن توسعه داده باشد، منو و نوار ابزار قدیمی، قطعا در هر جعبه ابزار یک توسعه دهنده خوب جای دارند.
WPF همراه با کنترل دقیق برای ایجاد منوها به نام Menu ... آمده است. افزودن المانها به آن بسیار ساده است - شما میتوانید به سادگی المان MenuItem را به آن اضافه کنید، و هر MenuItem میتواند طیف وسیعی از زیر منوها را ایجاد کند، Menu به شما امکان میدهد که منوهای پیچیده را همانطور که در بسیاری از برنامههای کاربردی ویندوز میشناسید، ایجاد کنید. اجازه دهید با ذکر مثالی ساده با نحوه استفاده از منو آشنا شویم:
<Window x:Class="WpfTutorialSamples.Common_interface_controls.MenuSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MenuSample" Height="200" Width="200">
<DockPanel>
<Menu DockPanel.Dock="Top">
<MenuItem Header="_File">
<MenuItem Header="_New" />
<MenuItem Header="_Open" />
<MenuItem Header="_Save" />
<Separator />
<MenuItem Header="_Exit" />
</MenuItem>
</Menu>
<TextBox AcceptsReturn="True" />
</DockPanel>
</Window>
همانطور که در بیشتر برنامههای کاربردی ویندوز، منو در بالای پنجره قرار دارد، اما به لطف انعطافپذیری عظیم WPF، در واقع میتوانید یک کنترل منو را هر کجا که دوست دارید، و در هر عرض یا ارتفاع ممکن که بخواهید قرار دهید.
من یک آیتم سطح-بالا را با 4 زیر منو و جداکننده برای آن تعریف کرده و از خاصیت Header برای تعریف لیبل آیتم استفاده میکنم،و باید توجه کنید که هر لیبل در شروع، کاراکتر زیرخط (آندرلاین) دارد. این کاراکتر به WPF میگوید برای استفاده از آن خاصیت بعنوان کلید تسریع کننده، به این معنی که کاربر برای فعال کردن آیتم منو میتواند کلید Alt را همراه با کاراکتر بعد از زیر خط، فشار دهد. همه این کار از طریق سلسله مراتب آیتم سطح-بالا و پایین کار میکند، با این معنی که در این مثال من میتوانم Alt، سپس F و سپس N را فشار دهیم تا آیتم New فعال شود.
آیکون و چکباکس
دو ویژگی مشترک آیتم منو، یکی آیکون است که برای راحتی شناسایی آیتم منو و آنچه که انجام خواهد داد، مورد استفاده قرار میگیرد و دیگری قابلیت تیکزدن آیتمهای منو است، که میتواند یک ویژگی خاص را در حالت روشن و خاموش قرار دهد. MenuItem در WPF از هر دو ویژگی پشتیبانی میکند و استفاده از آنها بسیار آسان است:
<Window x:Class="WpfTutorialSamples.Common_interface_controls.MenuIconCheckableSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MenuIconCheckableSample" Height="150" Width="300">
<DockPanel>
<Menu DockPanel.Dock="Top">
<MenuItem Header="_File">
<MenuItem Header="_Exit" />
</MenuItem>
<MenuItem Header="_Tools">
<MenuItem Header="_Manage users">
<MenuItem.Icon>
<Image Source="/WpfTutorialSamples;component/Images/user.png" />
</MenuItem.Icon>
</MenuItem>
<MenuItem Header="_Show groups" IsCheckable="True" IsChecked="True" />
</MenuItem>
</Menu>
<TextBox AcceptsReturn="True" />
</DockPanel>
</Window>
برای این مثال، یک آیتم سطح-بالای دیگر ایجاد کرده و دو زیر منو به آن افزودم: یکی با آیکون با استفاده از ویژگی آیکون با کنترل تصویر استاندارد داخل آن و دیگری جایی که ما از خاصیت IsChecked استفاده میکنیم تا کاربر بتواند آن را تیک زده و یا تیک آن را بردارد. من حتی از خاصیت IsChecked استفاده میکنم که آن به صورت پیشفرض تیکدار باشد. از Code-behind، همان ویژگی که میتوانید آن را بخوانید تا معلوم شود که آیا آیتم منو تیکدار است یا خیر.
مدیریت رویداد کلیک
هنگامی که کاربر بروی یک آیتم از منو کلیک میکند، معمولا میخواهد چیزی اتفاق بیافتد. سادهترین راه این است که یک هندلر رویداد کلیک به MenuItem اضافه کنید، مانند کد زیر:
<MenuItem Header="_New" Click="mnuNew_Click" />
در Code-behind نیاز خواهد بود، متد mnuNew_Click را اجرا کنید، مانند کد زیر:
private void mnuNew_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("New");
}
این برای برنامههای ساده و یا تمرین کافی است، اما در WPF این روشی است که از یک دستور برای انجام این کار استفاده میکنیم.
میانبرهای صفحه کلید و دستورات
شما به راحتی میتوانید رویداد کلیک یک آیتم در منو را مانند ما در بالا مدیریت کنید، اما رویکرد رایجتر این است که از دستورات در WPF استفاده کنید. نظریههای زیادی در مورد استفاده و ایجاد دستورات وجود دارد، بنابراین آنها ردهبندی خود را اینجا در مقالات سایت دارند، اما در حال حاضر، میتوانم بگویم که در هنگام استفاده از WPF، بخصوص در ترکیب با Menu یا Toolbar، چند مزیت وجود دارد.
اول از همه، آنها اطمینان میدهند که میتوانید عمل مشابه را در یک نوار ابزار، یک منو و حتی یک منوی کلیک راست، بدون نیاز به اجرای چندین کد در چندین مکان مختلف انجام دهید. همچنین آنها کار کردن با میانبرهای صفحه کلید را بسیار سادهتر میسازند، چون برخلاف WinForms در WPF بطور خودکار کلیدهای میانبر دریافت نمیشود، برای مثال اگر بخواهید میانبری به یک آیتم از منو اختصاص دهید - باید این کار را به صورت دستی انجام دهید.
با این حال، هنگام استفاده از دستورات، WPF همه آنها را شنیده و بطور خودکار به میانبرهای صفحه کلید پاسخ خواهد داد. متن آیتم منو (Header) نیز بصورت خودکار تنظیم میشود (اگر چه میتوانید در صورت نیاز دوباره آن را بنویسید)، بنابراین InputGestureText است، که نشان میدهد که کاربر کدام میانبر از صفحه کلید را میتواند برای فراخوانی یک آیتم منو خاص استفاده کند. بگذارید بطور مستقیم مثالی ترکیبی از Menu با دستورات WPF ببینیم:
<Window x:Class="WpfTutorialSamples.Common_interface_controls.MenuWithCommandsSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MenuWithCommandsSample" Height="200" Width="300">
<Window.CommandBindings>
<CommandBinding Command="New" CanExecute="NewCommand_CanExecute" Executed="NewCommand_Executed" />
</Window.CommandBindings>
<DockPanel>
<Menu DockPanel.Dock="Top">
<MenuItem Header="_File">
<MenuItem Command="New" />
<Separator />
<MenuItem Header="_Exit" />
</MenuItem>
<MenuItem Header="_Edit">
<MenuItem Command="Cut" />
<MenuItem Command="Copy" />
<MenuItem Command="Paste" />
</MenuItem>
</Menu>
<TextBox AcceptsReturn="True" Name="txtEditor" />
</DockPanel>
</Window>
using System;
using System.Windows;
using System.Windows.Input;
namespace WpfTutorialSamples.Common_interface_controls
{
public partial class MenuWithCommandsSample : Window
{
public MenuWithCommandsSample()
{
InitializeComponent();
}
private void NewCommand_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = true;
}
private void NewCommand_Executed(object sender, ExecutedRoutedEventArgs e)
{
txtEditor.Text = "";
}
}
}
ممکن است کاملا واضح نباشد اما با استفاده از دستورات، ما فقط یک دسته از موارد کلی را به صورت آزاد دریافت کردیم: میانبرهای صفحه کلید، متن و InputGestureText در آیتمها، و WPF بطور خودکار آیتمها را بسته به کنترل فعال و وضعیت آن فعال یا غیرفعال میکند. در این مورد، Cut و Copy غیرفعال هستند چون هیچ متنی انتخاب نشده است، اما Paste فعال است، زیرا کلیپ بورد سیستم من خالی نیست!
و از آنجا که WPF میداند چگونه دستورات خاص را در ترکیب با کنترلهای خاص اداره کند، در این مورد دستورات Cut / Copy / Paste در ترکیب با یک کنترل ورودی متن، حتی مجبور نیستیم رویدادهای اجرایی آنها را اداره کنیم -they work right out of the box! هر چند ما باید آن را برای مدیریت دستور New انجام دهیم، از آنجا که WPF هیچ راهی برای حدس زدن فعالیت در زمانی که کاربر فعال است و چیزی که ما می خواهیم آن لحطه انجام شود ندارد. این کار با CommandBindings در Window انجام میشود، که همه در جزئیات فصل، در دستورات توضیح داده شده است.
چکیده
کار با کنترل منو در WPF هم آسان و هم سریع است، ساخت آن حتی برای ایجاد سلسله منوهای پیچیده نیز ساده است، و با ترکیب آن با دستورات WPF، قابلیت های بسیار زیادی را به صورت رایگان دریافت می کنید.