Sürükleme ve bırakma hareketi tanıyıcıları ekleme
Sürükle ve bırak hareketi, öğelerin ve ilişkili veri paketlerinin sürekli hareket kullanılarak bir ekran konumundan başka bir konuma sürüklenmelerini sağlar. Sürükleyip bırakma tek bir uygulamada gerçekleşebileceği gibi, bir uygulamada başlayıp başka bir uygulamada da bitebilir.
Önemli
Sürükle ve bırak hareketlerinin tanınması iOS, Android ve Evrensel Windows Platformu (UWP) üzerinde desteklenir. Ancak, iOS'ta en az iOS 11 platformu gereklidir.
Sürükleme hareketinin başlatıldığı öğe olan sürükleme kaynağı, veri paketi nesnesi doldurularak aktarılacak verileri sağlayabilir. Sürükleme kaynağı serbest bırakıldığında bırakma gerçekleşir. Sürükleme kaynağının altındaki öğe olan bırakma hedefi, veri paketini işler.
Bir uygulamada sürükle ve bırak özelliğini etkinleştirme işlemi aşağıdaki gibidir:
- Bir öğeye nesne ekleyerek
DragGestureRecognizer
öğe üzerinde sürüklemeyiGestureRecognizers
etkinleştirin. Daha fazla bilgi için bkz . Sürüklemeyi etkinleştirme. - [isteğe bağlı] Veri paketi oluşturma. Xamarin.Forms görüntü ve metin denetimleri için veri paketini otomatik olarak doldurur, ancak diğer içerik için kendi veri paketinizi oluşturmanız gerekir. Daha fazla bilgi için bkz . Veri paketi oluşturma.
- Koleksiyonuna bir nesne ekleyerek öğede
DropGestureRecognizer
bırakma özelliğiniGestureRecognizers
etkinleştirin. Daha fazla bilgi için bkz . Bırakma özelliğini etkinleştirme. - [isteğe bağlı] Bırakma hedefi tarafından
DropGestureRecognizer.DragOver
izin verilen işlem türünü belirtmek için olayı işleyebilir. Daha fazla bilgi için bkz . DragOver olayını işleme. - [isteğe bağlı] Bırakılan içeriği almak için veri paketini işleyin. Xamarin.Forms veri paketinden görüntü ve metin verilerini otomatik olarak alır, ancak diğer içerik için veri paketini işlemeniz gerekir. Daha fazla bilgi için bkz . Veri paketini işleme.
Not
öğesine ve öğesinden CollectionView
öğe sürükleme işlemi şu anda desteklenmiyor.
Sürüklemeyi etkinleştir
içinde Xamarin.Forms, sürükleme hareketi tanıma sınıfı tarafından DragGestureRecognizer
sağlanır. Bu sınıf aşağıdaki özellikleri tanımlar:
CanDrag
, türündedirbool
. Bu, hareket tanıyıcının ekli olduğu öğenin bir sürükleme kaynağı olup olmadığını gösterir. Bu özelliğin varsayılan değeridirtrue
.DragStartingCommand
, türündedirICommand
ve bir sürükleme hareketi ilk tanındığında yürütülür.DragStartingCommandParameter
, türündekiobject
parametresineDragStartingCommand
geçirilir.DropCompletedCommand
, türündedirICommand
ve sürükleme kaynağı bırakıldığında yürütülür.DropCompletedCommandParameter
, türündekiobject
parametresineDropCompletedCommand
geçirilir.
Bu özellikler nesneler tarafından BindableProperty
desteklenir; bu da veri bağlamalarının hedefleri olabileceği ve stillendirilebileceği anlamına gelir.
DragGestureRecognizer
sınıfı ayrıca ve özelliğinin olması true
koşuluyla tetikleyen CanDrag
olayları tanımlar DragStarting
DropCompleted
. Bir DragGestureRecognizer
nesne bir sürükleme hareketi algıladığında öğesini yürütür DragStartingCommand
ve olayı çağırır DragStarting
. Ardından nesne bırakma hareketinin tamamlanmasını algıladığında DragGestureRecognizer
öğesini yürütür DropCompletedCommand
ve olayı çağırır DropCompleted
.
Olaya DragStartingEventArgs
eşlik DragStarting
eden nesne aşağıdaki özellikleri tanımlar:
Handled
türündebool
, olay işleyicisinin olayı işleyip işlemediğini veya kendi işlemeye devam edip Xamarin.Forms etmeyeceğini gösterir.Cancel
türündebool
, olayın iptal edilip edilmeyeceğini gösterir.Data
türündeDataPackage
, sürükleme kaynağına eşlik eden veri paketini gösterir. Bu salt okunur bir özelliktir.
Aşağıdaki XAML örneğinde bir öğesine eklenmiş bir DragGestureRecognizer
Image
gösterilmektedir:
<Image Source="monkeyface.png">
<Image.GestureRecognizers>
<DragGestureRecognizer />
</Image.GestureRecognizers>
</Image>
Bu örnekte, üzerinde Image
bir sürükleme hareketi başlatılabilir.
İpucu
iOS, Android ve UWP'de, uzun basın ve ardından sürükleme hareketi başlatılır.
Veri paketi oluşturma
Xamarin.Forms aşağıdaki denetimler için sürükleme başlatıldığında sizin için otomatik olarak bir veri paketi oluşturur:
- Metin denetimleri. Metin değerleri , ,
DatePicker
, ,Editor
,Entry
,Label
,RadioButton
,Switch
veTimePicker
nesnelerindenCheckBox
sürüklenebilir. - Görüntü denetimleri. Görüntüler ,
Image
veImageButton
denetimlerindenButton
sürüklenebilir.
Aşağıdaki tabloda, metin denetiminde sürükleme başlatıldığında okunan özellikler ve denenen dönüştürmeler gösterilmektedir:
Denetim | Özellik | Dönüştürme |
---|---|---|
CheckBox |
IsChecked |
bool öğesine string dönüştürüldü. |
DatePicker |
Date |
DateTime öğesine string dönüştürüldü. |
Editor |
Text |
|
Entry |
Text |
|
Label |
Text |
|
RadioButton |
IsChecked |
bool öğesine string dönüştürüldü. |
Switch |
IsToggled |
bool öğesine string dönüştürüldü. |
TimePicker |
Time |
TimeSpan öğesine string dönüştürüldü. |
Metin ve resim dışındaki içerikler için kendiniz bir veri paketi oluşturmanız gerekir.
Veri paketleri, aşağıdaki özellikleri tanımlayan sınıfı tarafından DataPackage
temsil edilir:
Properties
, türündedirDataPackagePropertySet
ve içinde yer alanDataPackage
verileri oluşturan bir özellik koleksiyonudur. Bu özellik salt okunur bir özelliktir.Image
, türündedirImageSource
ve içinde yer alanDataPackage
görüntüdür.Text
, türündedirstring
ve içinde bulunanDataPackage
metindir.View
, türününDataPackageView
salt okunur sürümüdürDataPackage
.
sınıfı, DataPackagePropertySet
olarak Dictionary<string,object>
depolanan bir özellik paketini temsil eder. sınıfı hakkında DataPackageView
bilgi için bkz . Veri paketini işleme.
Görüntü veya metin verilerini depolama
Görüntü veya metin verileri, veya DataPackage.Text
özelliğinde DataPackage.Image
depolanarak bir sürükleme kaynağıyla ilişkilendirilebilir. Bu, olay işleyicisinde DragStarting
gerçekleştirilebilir.
Aşağıdaki XAML örneği, olay için DragStarting
bir işleyici kaydeden bir gösterirDragGestureRecognizer
:
<Path Stroke="Black"
StrokeThickness="4">
<Path.GestureRecognizers>
<DragGestureRecognizer DragStarting="OnDragStarting" />
</Path.GestureRecognizers>
<Path.Data>
<!-- PathGeometry goes here -->
</Path.Data>
</Path>
Bu örnekte, DragGestureRecognizer
nesnesine Path
eklenir. olay DragStarting
işleyicisini yürüten üzerinde Path
bir sürükleme hareketi algılandığında olay tetiklenir OnDragStarting
:
void OnDragStarting(object sender, DragStartingEventArgs e)
{
e.Data.Text = "My text data goes here";
}
Olaya DragStartingEventArgs
eşlik DragStarting
eden nesnenin türünde DataPackage
bir Data
özelliği vardır. Bu örnekte, nesnesinin Text
DataPackage
özelliği olarak string
ayarlanır. DataPackage
Daha sonra, öğesini almak string
için bırakma sonrasında öğesine erişilebilir.
Verileri özellik paketinde depolama
Resimler ve metinler de dahil olmak üzere tüm veriler, verileri koleksiyonda DataPackage.Properties
depolayarak bir sürükleme kaynağıyla ilişkilendirilebilir. Bu, olay işleyicisinde DragStarting
gerçekleştirilebilir.
Aşağıdaki XAML örneği, olay için DragStarting
bir işleyici kaydeden bir gösterirDragGestureRecognizer
:
<Rectangle Stroke="Red"
Fill="DarkBlue"
StrokeThickness="4"
HeightRequest="200"
WidthRequest="200">
<Rectangle.GestureRecognizers>
<DragGestureRecognizer DragStarting="OnDragStarting" />
</Rectangle.GestureRecognizers>
</Rectangle>
Bu örnekte, DragGestureRecognizer
nesnesine Rectangle
eklenir. olay DragStarting
işleyicisini yürüten üzerinde Rectangle
bir sürükleme hareketi algılandığında olay tetiklenir OnDragStarting
:
void OnDragStarting(object sender, DragStartingEventArgs e)
{
Shape shape = (sender as Element).Parent as Shape;
e.Data.Properties.Add("Square", new Square(shape.Width, shape.Height));
}
Olaya DragStartingEventArgs
eşlik DragStarting
eden nesnenin türünde DataPackage
bir Data
özelliği vardır. Properties
Bir koleksiyon olan Dictionary<string, object>
nesnesinin DataPackage
koleksiyonu, gerekli verileri depolamak için değiştirilebilir. Bu örnekte sözlük, Properties
bir "Kare" anahtarına karşı boyutunu Rectangle
temsil eden bir Square
nesneyi depolamak için değiştirilmiştir.
Bırakmayı etkinleştir
içinde Xamarin.Formsbırakma hareketi tanıma sınıfı tarafından DropGestureRecognizer
sağlanır. Bu sınıf aşağıdaki özellikleri tanımlar:
AllowDrop
, türündedirbool
. Bu, hareket tanıyıcının bağlı olduğu öğenin bir bırakma hedefi olup olmadığını gösterir. Bu özelliğin varsayılan değeridirtrue
.DragOverCommand
, türündedirICommand
ve sürükleme kaynağı bırakma hedefinin üzerine sürüklendiğinde yürütülür.DragOverCommandParameter
, türündekiobject
parametresineDragOverCommand
geçirilir.DragLeaveCommand
, türündedirICommand
. Bu, sürükleme kaynağı bırakma hedefinin dışına sürüklendiğinde yürütülür.DragLeaveCommandParameter
, türündekiobject
parametresineDragLeaveCommand
geçirilir.DropCommand
, türündedirICommand
ve sürükleme kaynağı bırakma hedefinin üzerine bırakıldığında yürütülür.DropCommandParameter
, türündekiobject
parametresineDropCommand
geçirilir.
Bu özellikler nesneler tarafından BindableProperty
desteklenir; bu da veri bağlamalarının hedefleri olabileceği ve stillendirilebileceği anlamına gelir.
sınıfı ayrıca DropGestureRecognizer
özelliğinin olması true
koşuluyla tetikleyen , DragLeave
ve Drop
olaylarını AllowDrop
tanımlarDragOver
. bir DropGestureRecognizer
, bırakma hedefinin üzerindeki bir sürükleme kaynağını tanıdığında öğesini yürütür DragOverCommand
ve olayı çağırır DragOver
. Ardından, sürükleme kaynağı bırakma hedefinin dışına sürüklenirse DropGestureRecognizer
, öğesini yürütür DragLeaveCommand
ve olayı çağırır DragLeave
. Son olarak, bırakma hedefi üzerinde bir bırakma hareketi algıladığında DropGestureRecognizer
, öğesini yürütür DropCommand
ve olayı çağırır Drop
.
DragEventArgs
ve DragLeave
olaylarına DragOver
eşlik eden sınıfı aşağıdaki özellikleri tanımlar:
Data
, türündedirDataPackage
. Bu, sürükleme kaynağıyla ilişkili verileri içerir. Bu özellik salt okunur durumdadır.AcceptedOperation
, türüneDataPackageOperation
göre, bırakma hedefi tarafından izin verilen işlemleri belirtir.
Numaralandırma hakkında DataPackageOperation
bilgi için bkz . DragOver olayını işleme.
Olaya DropEventArgs
eşlik Drop
eden sınıf aşağıdaki özellikleri tanımlar:
Data
, veri paketinin salt okunur bir sürümü olan türündedirDataPackageView
.Handled
türündebool
, olay işleyicisinin olayı işleyip işlemediğini veya kendi işlemeye devam edip Xamarin.Forms etmeyeceğini gösterir.
Aşağıdaki XAML örneğinde bir öğesine eklenmiş bir DropGestureRecognizer
Image
gösterilmektedir:
<Image BackgroundColor="Silver"
HeightRequest="300"
WidthRequest="250">
<Image.GestureRecognizers>
<DropGestureRecognizer />
</Image.GestureRecognizers>
</Image>
Bu örnekte, sürükleme kaynağı bırakma hedefine Image
bırakıldığında, sürükleme kaynağı bir ImageSource
olması koşuluyla bırakma hedefine kopyalanır. Bunun nedeni Xamarin.Forms , sürüklenen görüntüleri ve metni uyumlu bırakma hedeflerine otomatik olarak kopyalamasıdır.
DragOver olayını işleme
Olay DropGestureRecognizer.DragOver
isteğe bağlı olarak, bırakma hedefi tarafından izin verilen işlem türlerini belirtmek için işlenebilir. Bu, olaya eşlik DragOver
eden nesnenin türünde DragEventArgs
DataPackageOperation
özelliğini ayarlayarak AcceptedOperation
gerçekleştirilebilir.
Numaralandırma DataPackageOperation
aşağıdaki üyeleri tanımlar:
None
, hiçbir eylemin gerçekleştirilmeyecek olduğunu gösterir.Copy
, sürükleme kaynağı içeriğinin bırakma hedefine kopyalandığını gösterir.
Önemli
Bir DragEventArgs
nesne oluşturulduğunda, AcceptedOperation
özelliği varsayılan olarak olarak DataPackageOperation.Copy
ayarlanır.
Aşağıdaki XAML örneği, olay için DragOver
bir işleyici kaydeden bir gösterirDropGestureRecognizer
:
<Image BackgroundColor="Silver"
HeightRequest="300"
WidthRequest="250">
<Image.GestureRecognizers>
<DropGestureRecognizer DragOver="OnDragOver" />
</Image.GestureRecognizers>
</Image>
Bu örnekte, DropGestureRecognizer
nesnesine Image
eklenir. Sürükle DragOver
kaynağı bırakma hedefinin üzerine sürüklendiğinde ancak bırakılmadığında olay tetiklenir ve olay işleyicisi OnDragOver
yürütülür:
void OnDragOver(object sender, DragEventArgs e)
{
e.AcceptedOperation = DataPackageOperation.None;
}
Bu örnekte, nesnesinin AcceptedOperation
DragEventArgs
özelliği olarak DataPackageOperation.None
ayarlanır. Bu, bir sürükleme kaynağı bırakma hedefinin üzerine bırakıldığında hiçbir işlem yapılmamasını sağlar.
Veri paketini işleme
Sürükle Drop
kaynağı bir bırakma hedefi üzerinden serbest bırakıldığında olay tetiklenir. Bu durumda, Xamarin.Forms bir sürükleme kaynağı aşağıdaki denetimlere bırakıldığında veri paketinden otomatik olarak veri almaya çalışır:
- Metin denetimleri. Metin değerleri , ,
DatePicker
,Editor
, ,Entry
,Label
,RadioButton
,Switch
veTimePicker
nesnelerineCheckBox
bırakılabilir. - Görüntü denetimleri. Görüntüler ,
Image
veImageButton
denetimlerineButton
bırakılabilir.
Aşağıdaki tabloda, metin tabanlı bir sürükleme kaynağı bir metin denetimine bırakıldığında ayarlanan özellikler ve denenen dönüştürmeler gösterilmektedir:
Denetim | Özellik | Dönüştürme |
---|---|---|
CheckBox |
IsChecked |
string , öğesine bool dönüştürülür. |
DatePicker |
Date |
string , öğesine DateTime dönüştürülür. |
Editor |
Text |
|
Entry |
Text |
|
Label |
Text |
|
RadioButton |
IsChecked |
string , öğesine bool dönüştürülür. |
Switch |
IsToggled |
string , öğesine bool dönüştürülür. |
TimePicker |
Time |
string , öğesine TimeSpan dönüştürülür. |
Metin ve resim dışındaki içerikler için veri paketini kendiniz işlemeniz gerekir.
DropEventArgs
Olaya eşlik Drop
eden sınıf türünde DataPackageView
bir Data
özellik tanımlar. Bu özellik, veri paketinin salt okunur bir sürümünü temsil eder.
Resim veya metin verilerini alma
Görüntü veya metin verileri, sınıfında tanımlanan yöntemler kullanılarak olay işleyicisindeki Drop
bir veri paketinden DataPackageView
alınabilir.
DataPackageView
sınıfı ve GetTextAsync
yöntemlerini içerirGetImageAsync
. GetImageAsync
yöntemi, özelliğinde DataPackage.Image
depolanan veri paketinden bir görüntü alır ve döndürürTask<ImageSource>
. Benzer şekilde yöntemi, GetTextAsync
özelliğinde DataPackage.Text
depolanan veri paketinden metin alır ve döndürür Task<string>
.
Aşağıdaki örnekte, bir Drop
için veri paketinden metin alan bir olay işleyicisi gösterilmektedir Path
:
async void OnDrop(object sender, DropEventArgs e)
{
string text = await e.Data.GetTextAsync();
// Perform logic to take action based on the text value.
}
Bu örnekte, metin verileri yöntemi kullanılarak GetTextAsync
veri paketinden alınır. Daha sonra metin değerini temel alan bir eylem yapılabilir.
Özellik paketinden veri alma
Herhangi bir veri paketi koleksiyonuna erişerek Properties
olay işleyicisindeki Drop
bir veri paketinden alınabilir.
DataPackageView
sınıfı türünde DataPackagePropertySetView
bir Properties
özellik tanımlar. sınıfı, DataPackagePropertySetView
olarak Dictionary<string, object>
depolanan salt okunur özellik paketini temsil eder.
Aşağıdaki örnekte, bir Drop
veri paketinin özellik paketinden veri alan bir Rectangle
olay işleyicisi gösterilmektedir:
void OnDrop(object sender, DropEventArgs e)
{
Square square = (Square)e.Data.Properties["Square"];
// Perform logic to take action based on retrieved value.
}
Bu örnekte, Square
nesnesi veri paketinin özellik paketinden "Kare" sözlük anahtarı belirtilerek alınır. Daha sonra alınan değeri temel alan bir eylem yapılabilir.