Xamarin.Forms MenuItem
sınıfı, Xamarin.FormsMenuItem
öğe bağlam menüleri ve Kabuk uygulaması açılır menüleri gibi ListView
menüler için menü öğelerini tanımlar.
Aşağıdaki ekran görüntüleri, iOS ve Android'de bağlam ListView
menüsündeki nesneleri gösterirMenuItem
:
MenuItem
sınıfı aşağıdaki özellikleri tanımlar:
Command
ICommand
, bir görünüm modelinde tanımlanan komutlara parmakla dokunma veya tıklama gibi kullanıcı eylemlerini bağlamaya olanak tanıyan bir işlemdir.CommandParameter
, öğesine geçirilmesi gereken parametreyi belirten birobject
değeridirCommand
.IconImageSource
, görüntü simgesini tanımlayan birImageSource
değerdir.IsDestructive
, öğesinin ilişkili ui öğesini listeden kaldırıp kaldırmadığınıMenuItem
gösteren birbool
değerdir.IsEnabled
, bu nesnenin kullanıcı girişine yanıt verip vermediğini gösteren birbool
değerdir.Text
, görüntüleme metnini belirten birstring
değerdir.
Bu özellikler nesneler tarafından BindableProperty
desteklenir, bu nedenle MenuItem
örnek veri bağlamalarının hedefi olabilir.
MenuItem Oluşturma
MenuItem
nesneleri, nesnenin öğelerindeki ListView
bağlam menüsünde kullanılabilir. En yaygın desen, bir örneğin içinde nesneleri oluşturmaktır MenuItem
ve bu, s ItemTemplate
için ListView
nesnesi olarak DataTemplate
kullanılır.ViewCell
ListView
Nesne doldurulduğunda, bağlam menüsü bir öğe için etkinleştirildiğinde seçenekleri ortaya çıkarmak MenuItem
için öğesini kullanarak DataTemplate
her öğeyi oluşturur.
Aşağıdaki örnek, bir ListView
nesne bağlamında örneklemeyi gösterirMenuItem
:
<ListView>
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<ViewCell.ContextActions>
<MenuItem Text="Context Menu Option" />
</ViewCell.ContextActions>
<Label Text="{Binding .}" />
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
MenuItem
Kodda da oluşturulabilir:
// A function returns a ViewCell instance that
// is used as the template for each list item
DataTemplate dataTemplate = new DataTemplate(() =>
{
// A Label displays the list item text
Label label = new Label();
label.SetBinding(Label.TextProperty, ".");
// A ViewCell serves as the DataTemplate
ViewCell viewCell = new ViewCell
{
View = label
};
// Add a MenuItem instance to the ContextActions
MenuItem menuItem = new MenuItem
{
Text = "Context Menu Option"
};
viewCell.ContextActions.Add(menuItem);
// The function returns the custom ViewCell
// to the DataTemplate constructor
return viewCell;
});
// Finally, the dataTemplate is provided to
// the ListView object
ListView listView = new ListView
{
...
ItemTemplate = dataTemplate
};
Olaylarla MenuItem davranışını tanımlama
MenuItem
sınıfı bir Clicked
olayı kullanıma sunar. XAML'deki örneğe yapılan dokunmalara veya tıklamalara MenuItem
tepki vermek için bu olaya bir olay işleyicisi eklenebilir:
<MenuItem ...
Clicked="OnItemClicked" />
Bir olay işleyicisi de koda eklenebilir:
MenuItem item = new MenuItem { ... }
item.Clicked += OnItemClicked;
Önceki örnekler bir OnItemClicked
olay işleyiciye başvuruda bulundu. Aşağıdaki kodda örnek bir uygulama gösterilmektedir:
void OnItemClicked(object sender, EventArgs e)
{
// The sender is the menuItem
MenuItem menuItem = sender as MenuItem;
// Access the list item through the BindingContext
var contextItem = menuItem.BindingContext;
// Do something with the contextItem here
}
MVVM ile MenuItem davranışını tanımlama
sınıfı, MenuItem
nesneler ve arabirim aracılığıyla BindableProperty
Model-View-ViewModel (MVVM) desenini ICommand
destekler. Aşağıdaki XAML, bir görünüm modelinde tanımlanan komutlara bağlı örnekleri gösterir MenuItem
:
<ContentPage.BindingContext>
<viewmodels:ListPageViewModel />
</ContentPage.BindingContext>
<StackLayout>
<Label Text="{Binding Message}" ... />
<ListView ItemsSource="{Binding Items}">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<ViewCell.ContextActions>
<MenuItem Text="Edit"
IconImageSource="icon.png"
Command="{Binding Source={x:Reference contentPage}, Path=BindingContext.EditCommand}"
CommandParameter="{Binding .}"/>
<MenuItem Text="Delete"
Command="{Binding Source={x:Reference contentPage}, Path=BindingContext.DeleteCommand}"
CommandParameter="{Binding .}"/>
</ViewCell.ContextActions>
<Label Text="{Binding .}" />
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout>
Önceki örnekte, görünüm modelindeki komutlara Command
bağlı ve CommandParameter
özellikleriyle iki MenuItem
nesne tanımlanmıştır. Görünüm modeli, XAML'de başvuruda bulunan komutları içerir:
public class ListPageViewModel : INotifyPropertyChanged
{
...
public ICommand EditCommand => new Command<string>((string item) =>
{
Message = $"Edit command was called on: {item}";
});
public ICommand DeleteCommand => new Command<string>((string item) =>
{
Message = $"Delete command was called on: {item}";
});
}
Örnek uygulama, nesneleri doldurmaya ListView
yönelik öğelerin listesini almak için kullanılan bir DataService
sınıf içerir. Sınıfından DataService
öğeler içeren bir görünüm modeli oluşturulur ve arka planda olarak olarak ayarlanır BindingContext
:
public MenuItemXamlMvvmPage()
{
InitializeComponent();
BindingContext = new ListPageViewModel(DataService.GetListItems());
}
MenuItem simgeleri
Uyarı
MenuItem
nesneler yalnızca Android'de simgeleri görüntüler. Diğer platformlarda, yalnızca özelliği tarafından Text
belirtilen metin görüntülenir.
Simgeler özelliği kullanılarak IconImageSource
belirtilir. Bir simge belirtilirse, özelliği tarafından Text
belirtilen metin görüntülenmez. Aşağıdaki ekran görüntüsünde, Android'de simgesi olan bir MenuItem
gösterilir:
içindeki Xamarin.Formsgörüntüleri kullanma hakkında daha fazla bilgi için bkz. içindeki Xamarin.Formsgörüntüler.
Çalışma zamanında MenuItem'i etkinleştirme veya devre dışı bırakma
Çalışma zamanında devre dışı bırakma MenuItem
özelliğini etkinleştirmek için, özelliğini Command
bir ICommand
uygulamaya bağlayın ve bir canExecute
temsilcinin öğesini uygun şekilde etkinleştirip devre dışı bırakdığından ICommand
emin olun.
Önemli
özelliğini etkinleştirirken veya devre dışı bırakırken Command
özelliğini başka bir özelliğe bağlamayın.IsEnabled
MenuItem
Aşağıdaki örnekte, özelliği adlandırılmış MyCommand
bir Command
MenuItem
öğeye bağlanan bir ICommand
gösterilmektedir:
<MenuItem Text="My menu item"
Command="{Binding MyCommand}" />
UygulamaICommand
, etkinleştirmek ve devre dışı bırakmak MenuItem
için bir özelliğin değerini döndüren bir bool
temsilci gerektirircanExecute
:
public class MyViewModel : INotifyPropertyChanged
{
bool isMenuItemEnabled = false;
public bool IsMenuItemEnabled
{
get { return isMenuItemEnabled; }
set
{
isMenuItemEnabled = value;
MyCommand.ChangeCanExecute();
}
}
public Command MyCommand { get; private set; }
public MyViewModel()
{
MyCommand = new Command(() =>
{
// Execute logic here
},
() => IsMenuItemEnabled);
}
}
Bu örnekte, MenuItem
özelliği ayarlanana IsMenuItemEnabled
kadar devre dışı bırakılır. Bu durum oluştuğunda, için temsilcinin Command.ChangeCanExecute
canExecute
MyCommand
yeniden değerlendirilmesine neden olan yöntemi çağrılır.
Platformlar arası bağlam menüsü davranışı
Bağlam menülerine her platformda farklı şekilde erişilir ve görüntülenir.
Android'de bağlam menüsü, bir liste öğesine uzun basılarak etkinleştirilir. Bağlam menüsü başlık ve gezinti çubuğu alanının yerini alır ve MenuItem
seçenekler yatay düğmeler olarak görüntülenir.
iOS'ta, bağlam menüsü bir liste öğesinde çekilerek etkinleştirilir. Bağlam menüsü liste öğesinde görüntülenir ve MenuItems
yatay düğmeler olarak görüntülenir.
UWP'de, bağlam menüsü bir liste öğesine sağ tıklanarak etkinleştirilir. Bağlam menüsü imlecin yanında dikey liste olarak görüntülenir.