Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Sürükleyip bırakma, bir uygulama içinde veya Windows masaüstündeki uygulamalar arasında veri aktarmanın sezgisel bir yoludur. Sürükleyip bırakma, kullanıcının standart bir hareket kullanarak uygulamalar arasında veya uygulama içinde veri aktarmasına olanak tanır (parmakla basılı tutup kaydırma veya fare veya ekran kalemiyle basıp kaydırma).
Önemli API'ler: CanDrag özelliği, AllowDrop özelliği
Sürükleme hareketinin tetiklendiği uygulama veya alan olan sürükleme kaynağı, metin, RTF, HTML, bit eşlemler, depolama öğeleri veya özel veri biçimleri gibi standart veri biçimleri içerebilen bir veri paketi nesnesi doldurarak aktarılacak verileri sağlar. Kaynak ayrıca desteklediği işlemlerin türünü de gösterir: kopyalama, taşıma veya bağlantı. İşaretçi serbest bırakıldığında bırakma gerçekleşir. İşaretçinin altındaki uygulama veya alan olan bırakma hedefi, veri paketini işler ve gerçekleştirdiği işlemin türünü geri döndürür.
Sürükle ve bırak işlemi sırasında sürükleme kullanıcı arabirimi, gerçekleşen sürükle ve bırak işleminin türünü görsel olarak gösterir. Bu görsel geri bildirim başlangıçta kaynak tarafından sağlanır, ancak işaretçi hedefler üzerinde hareket ettikçe hedefler görsel geri bildirimi değiştirebilir.
Sürükleyip bırakma, Win32 masaüstü uygulamaları da dahil olmak üzere herhangi bir uygulama türü arasında veya içinde veri aktarımına olanak tanır, ancak bu makale modern sürükle ve bırak için XAML API'sine odaklanır. Uygulama uygulandıktan sonra sürükleyip bırakma, uygulamadan uygulamaya, uygulamadan masaüstüne ve masaüstü uygulamasından uygulamaya gibi her yönde çalışır.
Aşağıda, uygulamanızda sürükle ve bırak özelliğini etkinleştirmek için yapmanız gerekenlere genel bir bakış bulabilirsiniz:
- CanDrag özelliğini true olarak ayarlayarak öğe üzerinde sürüklemeyi etkinleştirin.
- Veri paketini oluşturun. Sistem, resimleri ve metni otomatik olarak işler, ancak diğer içerik için DragStarting ve DropCompleted olaylarını işlemeniz ve bunları kullanarak kendi veri paketinizi oluşturmanız gerekir.
- AllowDrop özelliğini tüm bırakılan içeriği alabilen öğelerde true olarak ayarlayarak bırakma özelliğini etkinleştirin.
- Öğenin alabileceği sürükleme işlemlerinin türünü sisteme bildirmek için DragOver olayını işleyin.
- Bırakılan içeriği almak için Bırakma olayını işleyin.
Sürüklemeyi etkinleştir
Öğe üzerinde sürüklemeyi etkinleştirmek için CanDrag özelliğini true olarak ayarlayın. Bu, ListView gibi koleksiyonlar söz konusu olduğunda öğesini ve içerdiği öğeleri sürüklenebilir hale getirir.
Tam olarak hangi şeylerin sürüklenebilir olduğunu belirtin. Kullanıcılar uygulamanızdaki her şeyi, yalnızca resim veya metin gibi belirli öğeleri sürüklemek istemez.
İşte CanDragnasıl ayarlanır.
<Image x:Name="Image" CanDrag="True" Margin="10,292,10,0" Height="338"/>
Kullanıcı arabirimini özelleştirmek istemediğiniz sürece (bu makalenin devamında ele alınmıştır) sürüklemeye izin vermek için başka bir çalışma yapmanız gerekmez. Düşürmek birkaç adım daha gerektirir.
Veri paketi oluşturma
Çoğu durumda sistem sizin için bir veri paketi oluşturur. Sistem aşağıdakileri otomatik olarak işler:
- Resimler
- Metin
Diğer içerik için, DragStarting ve DropCompleted olaylarını işlemeniz ve bunları kullanarak kendi DataPackageoluşturmanız gerekir.
Uyarı
Burada açıklanan DragStarting olayı UIElement'in bir parçasıdır ve özel DataPackagebir oluşturmak için doğru olaydır. Bu, veri aktarımı yerine kaydırıcı stili sürükleme için kullanılan Başparmak denetimlerinde DragStarted olayından farklıdır.
DragStarting olayını işleme
DragStarting olayı, sistem içeren CanDrag="True"bir öğe üzerinde sürükleme işlemine başladığında tetikleniyor. Olay işleyicisinde , DragStartingEventArgs'ı kullanarak Data özelliğini ( datapackage) aktarmak istediğiniz içerikle doldurur ve RequestedOperation değerini işlemin bir kopya, taşıma veya bağlantı olup olmadığını gösterecek şekilde ayarlarsınız.
İlk olarak, XAML öğesini hem DragStarting hem de DropCompleted olay işleyicisiyle ayarlayın:
<TextBlock x:Name="DraggableText" CanDrag="True"
DragStarting="DraggableText_DragStarting"
DropCompleted="DraggableText_DropCompleted"
Text="Drag this text to another location"/>
Ardından arka planda yer alan kodda DragStarting olayını işleyerek veri paketini doldurun:
private void DraggableText_DragStarting(UIElement sender, DragStartingEventArgs args)
{
// Add the text content to the data package
args.Data.SetText(((TextBlock)sender).Text);
// Indicate that both Copy and Move are acceptable
args.Data.RequestedOperation = DataPackageOperation.Copy | DataPackageOperation.Move;
}
Veri paketini oluştururken (örneğin, bir dosyayı okurken) zaman uyumsuz çalışma gerçekleştirmeniz gerekiyorsa, iş tamamlanana kadar olayı etkin tutmak için GetDeferral yöntemini kullanın:
private async void DraggableText_DragStarting(UIElement sender, DragStartingEventArgs args)
{
var deferral = args.GetDeferral();
try
{
// Perform async work here, for example loading file content
string content = await LoadCustomTextAsync();
args.Data.SetText(content);
args.Data.RequestedOperation = DataPackageOperation.Copy;
}
finally
{
deferral.Complete();
}
}
DropCompleted olayını işleme
DropCompleted olayı, sürükle-bırak işlemi sona erdiğinde sürükleme kaynağında tetiklenir; öğe başarıyla bırakılmış da olsa sürükleme iptal edilmiş de olsa. DropCompletedEventArgs.DropResult özelliğini kullanarak sonucu belirleyin ve taşıma işlemi gerçekleştirildiğinde kaynak öğeyi kaldırma gibi bir işlem yapın:
private void DraggableText_DropCompleted(UIElement sender, DropCompletedEventArgs args)
{
if (args.DropResult == DataPackageOperation.Move)
{
// The target accepted the data as a Move, so clear the source
((TextBlock)sender).Text = string.Empty;
}
}
Veri paketiyle özel sürükle ve bırak işleminin tam bir çalışma örneği için GitHub üzerinde XAML sürükle ve bırak örneğine bakın.
Bırakma özelliğini etkinleştirme
Aşağıdaki işaretlemede AllowDrop özelliğinin, uygulamanın bir alanının sürüklenen bir öğe için geçerli bir bırakma hedefi olduğunu belirtmek için nasıl kullanılabileceğini gösterir (belirtilen alanın boş bir arka planı olmamalıdır, işaretçi girişi alabilmesi gerekir ve öğe belirtilen alan dışında herhangi bir yere bırakılamaz).
Uyarı
Genellikle, kullanıcı arabirimi öğesinin varsayılan olarak boş bir arka planı vardır. Kullanıcıların uygulamanızın içinde herhangi bir yere öğe bırakabilmesini istiyorsanız, uygulama arka planı null olamaz (arka plan görünür olmayacaksa ayarlanır Background="Transparent" ).
<Grid AllowDrop="True" DragOver="Grid_DragOver" Drop="Grid_Drop"
Background="LightBlue" Margin="10,10,10,353">
<TextBlock>Drop anywhere in the blue area</TextBlock>
</Grid>
DragOver olayını işleme
DragOver olayı, kullanıcı bir öğeyi uygulamanızın üzerine sürüklediğinde ancak henüz bırakmadığında tetikler. Bu işleyicide AcceptedOperation özelliğini kullanarak uygulamanızın ne tür işlemleri desteklediğini belirtmeniz gerekir. Kopyalama en yaygın olanıdır.
private void Grid_DragOver(object sender, DragEventArgs e)
{
e.AcceptedOperation = DataPackageOperation.Copy;
}
Drop olayını işleme
Bırakma olayı, kullanıcı öğeleri geçerli bir bırakma alanında serbest bıraktığında gerçekleşir. DataView özelliğini kullanarak bunları işleyin.
Aşağıdaki örnekte kolaylık olması için kullanıcının tek bir fotoğraf bıraktığını ve bu fotoğrafa doğrudan eriş ettiğini varsayacağız. Gerçekte, kullanıcılar aynı anda farklı biçimlerde birden çok öğe bırakabilir. Uygulamanız, bırakılan dosya türlerini ve kaç tane dosya olduğunu denetleyerek ve her birini uygun şekilde işleyerek bu olasılığı ele almalıdır. Ayrıca uygulamanızın desteklemediği bir şey yapmaya çalışan kullanıcıyı bilgilendirmeyi de göz önünde bulundurmalısınız.
private async void Grid_Drop(object sender, DragEventArgs e)
{
if (e.DataView.Contains(StandardDataFormats.StorageItems))
{
var items = await e.DataView.GetStorageItemsAsync();
if (items.Count > 0)
{
var storageFile = items[0] as StorageFile;
var bitmapImage = new BitmapImage();
bitmapImage.SetSource(await storageFile.OpenAsync(FileAccessMode.Read));
// Set the image on the main page to the dropped image
Image.Source = bitmapImage;
}
}
}
Kullanıcı arabirimini özelleştirme
Sistem, sürükleme ve bırakma için varsayılan bir kullanıcı arabirimi sağlar. Bununla birlikte, özel açıklamalı alt yazılar ve glifler ayarlayarak veya kullanıcı arabirimini hiç göstermemeyi tercih ederek kullanıcı arabiriminin çeşitli bölümlerini özelleştirmeyi de seçebilirsiniz. Kullanıcı arabirimini özelleştirmek için DragEventArgs.DragUIOverride özelliğini kullanın.
private void Grid_DragOverCustomized(object sender, DragEventArgs e)
{
e.AcceptedOperation = DataPackageOperation.Copy;
e.DragUIOverride.Caption = "Custom text here"; // Sets custom UI text
// Sets a custom glyph
e.DragUIOverride.SetContentFromBitmapImage(
new BitmapImage(
new Uri("ms-appx:///Assets/CustomImage.png", UriKind.RelativeOrAbsolute)));
e.DragUIOverride.IsCaptionVisible = true; // Sets if the caption is visible
e.DragUIOverride.IsContentVisible = true; // Sets if the dragged content is visible
e.DragUIOverride.IsGlyphVisible = true; // Sets if the glyph is visibile
}
Dokunarak sürükleyebileceğiniz bir öğenin bağlam menüsünü açma
Dokunma kullanırken, bir UIElement öğesini sürüklemek ve bağlam menüsünü açmak için benzer dokunma hareketleri gerektirir; her bir basarak ve bekleyerek başlar. Sistem, uygulamanızda her ikisini de destekleyen öğeler için iki eylem arasında aşağıdaki gibi ayrımlar gerçekleştirir:
- Kullanıcı bir öğeye basıp tutar ve öğeyi 500 milisaniye içinde sürüklemeye başlarsa, öğe sürüklenir ve bağlam menüsü gösterilmez.
- Kullanıcı 500 milisaniye içinde basılı tutar ancak sürüklemezse bağlam menüsü açılır.
- Bağlam menüsü açıldıktan sonra, kullanıcı öğeyi sürüklemeye çalışırsa (parmağını kaldırmadan), bağlam menüsü kapatılır ve sürükleme başlatılır.
ListView veya GridView'da bir öğeyi klasör olarak belirleme
Klasör olarak ListViewItem veya GridViewItem belirtebilirsiniz. Bu özellikle TreeView ve Dosya Gezgini senaryoları için kullanışlıdır. Bunu yapmak için, bu öğede AllowDrop özelliğini açıkça True olarak ayarlayın.
Sistem, bir klasöre bırakma ve klasör olmayan bir öğeye bırakma için uygun animasyonları otomatik olarak gösterir. Veri kaynağını güncelleştirmek ve bırakılan öğeyi hedef klasöre eklemek için uygulama kodunuzun klasör öğesinde (klasör olmayan öğede olduğu gibi) Drop olayını işlemeye devam etmesi gerekir.
ListViews içinde sürükleyip bırakma yeniden sıralamasını etkinleştirme
ListViews, bu makalede açıklanan CanDrop API'sine çok benzer bir API kullanarak sürükleyerek yeniden sıralamayı destekler. En azından AllowDrop ve CanReorderItems özelliklerini ekleyin.
Daha fazla bilgi için bkz. ListViewBase.CanReorderItems .
Özel sürükle ve bırak işlemi gerçekleştirme
UIElement sınıfı, sizin için sürükle ve bırak uygulama işinin çoğunu yapar. Ancak isterseniz aşağıdaki API'leri kullanarak kendi sürümünüzü uygulayabilirsiniz.
| İşlevsellik | Windows Uygulama SDK'sı Microsoft.UI.Input.DragDrop ad alanı |
|---|---|
| DragPrimitive | DragOperation |
| Veri paketi oluşturma | DataPackage |
| Sürükleme kontrolünü kabuğa devret | DragOperation.StartAsync |
| Kabuktan bırakılanı almak |
DragDropManager.TargetRequested IDropOperationTarget |
Ayrıca bakınız
Windows developer