Sürükleme kaynağını sürüklerken yalnızca dairesel bir yolun sınırları içinde hareket etmeyi kısıtlamak mümkün mü?Dairesel bir yolda sürüklemeye nasıl izin veririm?
5
A
cevap
5
360 maddelik yolunu gerekmez. Bunun yerine, sürüklerken, geçerli açıyı Math.Atan2(Y,X)
kullanarak hesaplayın ve ardından dairenin üzerindeki noktayı oluşturun. Yeniden boyutlandırmak ve saklamak için center
ve radius
hesaplamaları yapmalı veya bunları MouseMove içinde hesaplamanız gerekir.
private void UserControl_MouseMove(object sender, MouseEventArgs e)
{
if (!isDraggingMarker)
return;
var position = e.GetPosition(this);
double angle = Math.Atan2(position.Y - center.Y, position.X - center.X);
var closest = new Point(center.X + radius*Math.Cos(angle),
center.Y + radius*Math.Sin(angle));
SetMarkerPosition(closest);
}
1
Noktalardan oluşan bir daire oluşturun ve ardından fare hareket ettiğinde (ve sürükleniyoruz) en yakın noktayı hesaplayın ve bu noktaya geçin.
CircularDrag.xaml
<UserControl x:Class="DraggingBoundaries.CircularDrag"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300"
SizeChanged="UserControl_SizeChanged"
MouseMove="UserControl_MouseMove"
MouseLeave="UserControl_MouseLeave"
MouseLeftButtonUp="UserControl_MouseLeftButtonUp"
>
<Grid Background="White">
<Border
x:Name="Marker"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Width="14"
Height="14"
Background="CornflowerBlue"
CornerRadius="2"
BorderThickness="1"
BorderBrush="DarkGray"
MouseLeftButtonDown="Marker_MouseLeftButtonDown"
/>
</Grid>
</UserControl>
CircularDrag.xaml.cs
using System;
using System.Linq;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
namespace DraggingBoundaries
{
public partial class CircularDrag : UserControl
{
List<Point> allowedWheelMarkerPositions;
bool isDraggingMarker;
public CircularDrag()
{
InitializeComponent();
}
private void UserControl_SizeChanged(object sender, SizeChangedEventArgs e)
{
var center = new Point(e.NewSize.Width/2, e.NewSize.Height/2);
var radius = (center.X < center.Y ? center.X : center.Y) - 15;
allowedWheelMarkerPositions = CreateCirclePath(center, radius);
SetMarkerPosition(allowedWheelMarkerPositions.First());
}
private List<Point> CreateCirclePath(Point center, double radius)
{
var result = new List<Point>();
for (double angle = 0; angle <= 360; angle++)
{
double angleR = angle * (Math.PI/180);
double x = center.X + Math.Cos(angleR) * radius;
double y = center.Y - Math.Sin(angleR) * radius;
result.Add(new Point(x, y));
}
return result;
}
private void UserControl_MouseMove(object sender, MouseEventArgs e)
{
if (!isDraggingMarker)
return;
var position = e.GetPosition(this);
var closest = allowedWheelMarkerPositions
.OrderBy(p => GetDistance(position, p))
.First();
SetMarkerPosition(closest);
}
private void SetMarkerPosition(Point closest)
{
Marker.Margin = new Thickness(closest.X - Marker.Width/2, closest.Y - Marker.Height/2, 0, 0);
}
private double GetDistance(Point a, Point b)
{
var deltaX = a.X - b.X;
var deltaY = a.Y - b.Y;
return Math.Sqrt(Math.Pow(deltaX, 2) + Math.Pow(deltaY, 2));
}
private void Marker_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
isDraggingMarker = true;
}
private void UserControl_MouseLeave(object sender, MouseEventArgs e)
{
isDraggingMarker = false;
}
private void UserControl_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
isDraggingMarker = false;
}
}
}
İlgili konular
- 1. WinForm PropertyGrid'de bir "flag" enum'un düzenlenmesine nasıl izin veririm?
- 2. JQuery kullanarak bir görüntüyü dairesel bir yolda nasıl hareket ettirirsiniz? İşte
- 3. ASP.NET WebApi - İstemci sertifikalarına "gerek" değil "nasıl" izin veririm?
- 4. Güçlü Params + Rails4 - Özel olarak nasıl izin veririm?
- 5. Tek bir tıklamayla öğeyi başlatıp sürüklemeye başlayın
- 6. Ona tıkladığımda TextBox'a nasıl bir değer veririm?
- 7. Bir facebook sayfası yöneticisinin uygulamamı yönetmek istedikleri belirli sayfaları seçmesine nasıl izin veririm (manage_pages)
- 8. Windows uygulamasında datagridview'de yalnızca belirli bir sütunu düzenlemeye nasıl izin veririm?
- 9. Kök olmayan bir kullanıcı olarak nasıl "kullanıcı oluştur" veririm?
- 10. Dairesel yoldaki görüntüyü ROT ETME
- 11. Kullanıcıların Facebook şirket profilimizi iOS için Facebook SDK'sını kullanarak "Beğen" yapmalarına nasıl izin veririm?
- 12. WPF: ListView öğelerini sürüklerken, ListView'de fare tekerleği ile kaydırma yapmaya nasıl izin veririm?
- 13. Firefox 5'te yerel dosyalardan (dosya: /// adresler) pop-up'lara nasıl izin veririm?
- 14. HTMLPurifier'ta komut, nesne, param, katıştır ve iframe etiketlerine nasıl izin veririm?
- 15. Intellij hatası gulp yolda değil
- 16. @ "../ .." ifadesi bir yolda ne anlama geliyor?
- 17. Winst'te dairesel bir yoldaki metni nasıl canlandırabilirim?
- 18. dairesel ithalat
- 19. Bu dairesel bağımlılıktan nasıl kurtuluruz?
- 20. Dairesel (sonsuz) RecyclerView nasıl oluştururum?
- 21. Bu dairesel bağımlılığı nasıl çözebilirim?
- 22. Belirli html etiketlerine nasıl izin verilir?
- 23. Bir jalelayı jtxtpane içine, bir konumdan başka bir yere sürüklemeye benzer şekilde nasıl taşıyabilirim?
- 24. Uygulama izinlerimi oluşturduğum sayfa veya gruplara nasıl veririm?
- 25. Üç boyutlu dairesel arabellek
- 26. Bir kullanıcının tarayıcıyı başlatmadan HTML/Web Sitesi içeriğini taramasına nasıl izin veririm (satır içi tarayıcıya ihtiyaç duyar)?
- 27. TipScript'te Dairesel Tip Referanslar
- 28. Atanmış yolda seyahat ederken harcanan zaman azalır.
- 29. Dairesel sektör çizme
- 30. "dairesel" ortalama R
Bu yöntemle işaretçiyi tam daire içinde sürükleyemiyorum (yalnızca dörtte biri). Bir şey mi eksik? – loraderon
Sanırım merkeze göre açıyı hesaplamayı unuttum. Yukarıda güncellendi. – Justin
Teşekkürler, şimdi beklendiği gibi çalışıyor! – loraderon