Aracılığıyla paylaş


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:

  1. Bir öğeye nesne ekleyerek DragGestureRecognizer öğe üzerinde sürüklemeyi GestureRecognizers etkinleştirin. Daha fazla bilgi için bkz . Sürüklemeyi etkinleştirme.
  2. [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.
  3. Koleksiyonuna bir nesne ekleyerek öğede DropGestureRecognizer bırakma özelliğini GestureRecognizers etkinleştirin. Daha fazla bilgi için bkz . Bırakma özelliğini etkinleştirme.
  4. [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.
  5. [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ündedir bool. 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ğeridir true.
  • DragStartingCommand, türündedir ICommandve bir sürükleme hareketi ilk tanındığında yürütülür.
  • DragStartingCommandParameter, türündeki objectparametresine DragStartingCommandgeçirilir.
  • DropCompletedCommand, türündedir ICommandve sürükleme kaynağı bırakıldığında yürütülür.
  • DropCompletedCommandParameter, türündeki objectparametresine DropCompletedCommandgeç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ı truekoşuluyla tetikleyen CanDrag olayları tanımlar DragStartingDropCompleted. 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:

  • Handledtüründe bool, olay işleyicisinin olayı işleyip işlemediğini veya kendi işlemeye devam edip Xamarin.Forms etmeyeceğini gösterir.
  • Canceltüründe bool, olayın iptal edilip edilmeyeceğini gösterir.
  • Datatüründe DataPackage, 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 DragGestureRecognizerImagegösterilmektedir:

<Image Source="monkeyface.png">
    <Image.GestureRecognizers>
        <DragGestureRecognizer />
    </Image.GestureRecognizers>
</Image>

Bu örnekte, üzerinde Imagebir 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:

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 stringdönüştürüldü.
DatePicker Date DateTime öğesine stringdönüştürüldü.
Editor Text
Entry Text
Label Text
RadioButton IsChecked bool öğesine stringdönüştürüldü.
Switch IsToggled bool öğesine stringdönüştürüldü.
TimePicker Time TimeSpan öğesine stringdö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ündedir DataPackagePropertySetve içinde yer alan DataPackageverileri oluşturan bir özellik koleksiyonudur. Bu özellik salt okunur bir özelliktir.
  • Image, türündedir ImageSourceve içinde yer alan DataPackagegörüntüdür.
  • Text, türündedir stringve içinde bulunan DataPackagemetindir.
  • View, türünün DataPackageViewsalt okunur sürümüdür DataPackage.

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 Pathbir 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 DataPackagebir Data özelliği vardır. Bu örnekte, nesnesinin TextDataPackage özelliği olarak stringayarlanır. DataPackage Daha sonra, öğesini almak stringiç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 Rectanglebir 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 DataPackagebir 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 Rectangletemsil 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ündedir bool. 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ğeridir true.
  • DragOverCommand, türündedir ICommandve sürükleme kaynağı bırakma hedefinin üzerine sürüklendiğinde yürütülür.
  • DragOverCommandParameter, türündeki objectparametresine DragOverCommandgeçirilir.
  • DragLeaveCommand, türündedir ICommand. Bu, sürükleme kaynağı bırakma hedefinin dışına sürüklendiğinde yürütülür.
  • DragLeaveCommandParameter, türündeki objectparametresine DragLeaveCommandgeçirilir.
  • DropCommand, türündedir ICommandve sürükleme kaynağı bırakma hedefinin üzerine bırakıldığında yürütülür.
  • DropCommandParameter, türündeki objectparametresine DropCommandgeç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ı truekoşuluyla tetikleyen , DragLeaveve 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ündedir DataPackage. Bu, sürükleme kaynağıyla ilişkili verileri içerir. Bu özellik salt okunur durumdadır.
  • AcceptedOperation, türüne DataPackageOperationgö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ündedir DataPackageView.
  • Handledtüründe bool, 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 DropGestureRecognizerImagegö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 ImageSourceolması 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 DragEventArgsDataPackageOperationö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.Copyayarlanı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 AcceptedOperationDragEventArgs özelliği olarak DataPackageOperation.Noneayarlanı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:

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 booldönüştürülür.
DatePicker Date string , öğesine DateTimedönüştürülür.
Editor Text
Entry Text
Label Text
RadioButton IsChecked string , öğesine booldönüştürülür.
Switch IsToggled string , öğesine booldönüştürülür.
TimePicker Time string , öğesine TimeSpandö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 DataPackageViewbir 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 DataPackagePropertySetViewbir 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 Rectangleolay 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.