C# 径向滑块超宽带
我想创建一个径向滑块。这是我写的代码,但我不明白我错在哪里 MainPage.xaml:C# 径向滑块超宽带,c#,uwp,slider,C#,Uwp,Slider,我想创建一个径向滑块。这是我写的代码,但我不明白我错在哪里 MainPage.xaml: <Grid> <Grid x:Name="GridBase" Width="207" Height="207"> <Grid Height="207" Width="207" HorizontalAlignment="Center" VerticalAlignment="Center"> <Path Stroke="#
<Grid>
<Grid x:Name="GridBase" Width="207" Height="207">
<Grid Height="207" Width="207" HorizontalAlignment="Center" VerticalAlignment="Center">
<Path Stroke="#FF34A1ED" StrokeThickness="7" x:Name="arcPath" StrokeEndLineCap="Round" StrokeStartLineCap="Round" RenderTransformOrigin="0.5,0.5">
<Path.RenderTransform>
<CompositeTransform TranslateX="3.5" TranslateY="3.5"/>
</Path.RenderTransform>
<Path.Data>
<PathGeometry>
<PathFigure x:Name="myArcStart" StartPoint="7.612,61.6317">
<ArcSegment x:Name="myArc" IsLargeArc="true" Point="192.388,61.6317" Size="100,100"/>
</PathFigure>
</PathGeometry>
</Path.Data>
</Path>
</Grid>
<Canvas x:Name="CanvasVolume" Width="207" Height="207" RenderTransformOrigin="0.5,0.5">
<Canvas.RenderTransform>
<CompositeTransform x:Name="CompositePoint" Rotation="0"/>
</Canvas.RenderTransform>
<Ellipse x:Name="VolumePoint" Width="20" Height="20" Fill="#9923678A" PointerPressed="VolumePoint_PointerPressed" Canvas.Top="{x:Bind TopPosition, Mode=OneWay}" Canvas.Left="{x:Bind LeftPosition, Mode=OneWay}"/>
</Canvas>
</Grid>
</Grid>
MainPage.xaml.cs:
public sealed partial class MainPage : Page, INotifyPropertyChanged
{
private double topPosition = 55.2317;
public double TopPosition
{
get => topPosition;
set
{
topPosition = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(TopPosition)));
}
}
private double leftPosition = 1.112;
public double LeftPosition
{
get => leftPosition;
set
{
leftPosition = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(LeftPosition)));
}
}
public event PropertyChangedEventHandler PropertyChanged;
public MainPage()
{
this.InitializeComponent();
}
private void VolumePoint_PointerPressed(object sender, PointerRoutedEventArgs e)
{
Point puntopressd = e.GetCurrentPoint(CanvasVolume).Position;
PointerEventHandler moved = null;
moved = (s, args) =>
{
CanvasVolume.CapturePointer(e.Pointer);
Point puntomoved = e.GetCurrentPoint(CanvasVolume).Position;
double puntoX = puntomoved.X;
double puntoY = puntomoved.Y;
double raggio = 100;
if (puntoX < 100 && puntoY < 100)
{
double C1 = raggio - puntoY;
double C2 = Math.Sqrt((raggio * raggio) - (C1 * C1));
double RadBeta = ((C1 * C1) + (raggio * raggio) - (C2 * C2)) / (2 * C1 * raggio);
double Beta = Math.Acos(RadBeta);
double coorX = raggio * (1 - Math.Sin(Beta));
TopPosition = puntoY - 6;
LeftPosition = coorX - 6;
}
else if (puntoX < 100 && puntoY > 100)
{
double C1 = puntoY - raggio;
double C2 = Math.Sqrt((raggio * raggio) - (C1 * C1));
double RadBeta = ((raggio * raggio) + (C1 * C1) - (C2 * C2)) / (2 * C1 * raggio);
double Beta = Math.Acos(RadBeta);
double coorX = raggio * (1 - Math.Sin(Beta));
TopPosition = puntoY - 6;
LeftPosition = coorX - 6;
}
else if (puntoX > 100 && puntoY > 100)
{
double C1 = puntoY - raggio;
double C2 = Math.Sqrt((raggio * raggio) - (C1 * C1));
double RadBeta = ((raggio * raggio) + (C1 * C1) - (C2 * C2)) / (2 * C1 * raggio);
double Beta = Math.Acos(RadBeta);
double coorX = raggio + C2;
TopPosition = puntoY - 6;
LeftPosition = coorX - 6;
}
else if (puntoX > 100 && puntoY < 100)
{
double C1 = raggio - puntoY;
double C2 = Math.Sqrt((raggio * raggio) - (C1 * C1));
double RadBeta = ((C1 * C1) + (raggio * raggio) - (C2 * C2)) / (2 * C1 * raggio);
double Beta = Math.Acos(RadBeta);
double coorX = raggio + C2;
TopPosition = puntoY - 6;
LeftPosition = coorX - 6;
}
};
PointerEventHandler released = null;
released = (s, args) =>
{
Point puntoreleas = e.GetCurrentPoint(CanvasVolume).Position;
CanvasVolume.PointerMoved -= moved;
CanvasVolume.PointerReleased -= released;
};
CanvasVolume.PointerMoved += moved;
CanvasVolume.PointerReleased += released;
}
}
公共密封部分类主页面:第页,INotifyPropertyChanged
{
私人双排位=55.2317;
公共双重地位
{
get=>topPosition;
设置
{
顶端位置=值;
PropertyChanged?.Invoke(这是新的propertychangedventargs(nameof(TopPosition));
}
}
私人双左位=1.112;
公共双左位
{
get=>leftPosition;
设置
{
leftPosition=值;
PropertyChanged?.Invoke(这是新的PropertyChangedEventArgs(nameof(LeftPosition));
}
}
公共事件属性更改事件处理程序属性更改;
公共主页()
{
this.InitializeComponent();
}
私有void VolumePoint_PointerPressed(对象发送方,PointerRoutedEventArgs e)
{
点puntopressd=e.GetCurrentPoint(画布体积)。位置;
PointerEventHandler moved=null;
移动=(s,args)=>
{
CanvasVolume.CapturePointer(e.Pointer);
点puntomoved=e.GetCurrentPoint(CanvasVolume)。位置;
双puntoX=puntomoved.X;
双puntoY=puntomoved.Y;
双拉吉奥=100;
如果(puntoX<100&&puntoY<100)
{
双C1=raggio-puntoY;
double C2=数学Sqrt((raggio*raggio)-(C1*C1));
双RadBeta=((C1*C1)+(raggio*raggio)-(C2*C2))/(2*C1*raggio);
double Beta=Math.Acos(RadBeta);
double coorX=raggio*(1-数学Sin(Beta));
TopPosition=puntoY-6;
LeftPosition=coorX-6;
}
否则如果(puntoX<100&&puntoY>100)
{
双C1=朋托-拉吉奥;
double C2=数学Sqrt((raggio*raggio)-(C1*C1));
双RadBeta=((raggio*raggio)+(C1*C1)-(C2*C2))/(2*C1*raggio);
double Beta=Math.Acos(RadBeta);
double coorX=raggio*(1-数学Sin(Beta));
TopPosition=puntoY-6;
LeftPosition=coorX-6;
}
否则如果(puntoX>100&&puntoY>100)
{
双C1=朋托-拉吉奥;
double C2=数学Sqrt((raggio*raggio)-(C1*C1));
双RadBeta=((raggio*raggio)+(C1*C1)-(C2*C2))/(2*C1*raggio);
double Beta=Math.Acos(RadBeta);
双coorX=raggio+C2;
TopPosition=puntoY-6;
LeftPosition=coorX-6;
}
否则如果(puntoX>100&&puntoY<100)
{
双C1=raggio-puntoY;
double C2=数学Sqrt((raggio*raggio)-(C1*C1));
双RadBeta=((C1*C1)+(raggio*raggio)-(C2*C2))/(2*C1*raggio);
double Beta=Math.Acos(RadBeta);
双coorX=raggio+C2;
TopPosition=puntoY-6;
LeftPosition=coorX-6;
}
};
PointerEventHandler released=null;
已发布=(s,args)=>
{
点puntoreleas=e.GetCurrentPoint(CanvasVolume)。位置;
CanvasVolume.PointerMoved-=已移动;
CanvasVolume.PointerReleased-=已发布;
};
CanvasVolume.PointerMoved+=已移动;
CanvasVolume.PointerReleased+=已发布;
}
}
椭圆从一边移动到另一边,在0度和180度的点上它消失了,我该怎么解呢?我认为问题在于所提出的条件,但我不确定
谢谢你的帮助
椭圆从一侧移动到另一侧,在0度和180度的点上消失
在puntoX>100和puntoY>100
中,有时函数Math.Sqrt((raggio*raggio)-(C1*C1))
将返回NaN。当C1属性的值大于raggio时,因此平方值为负,则返回NaN,椭圆消失。你可以从这一点上解决这个问题
此外,我还有另一个简单的解决方法,使用圆的一些特性来处理它,可以使椭圆很好地移动。您可以尝试以下代码段
moved = (s, args) =>
{
CanvasVolume.CapturePointer(e.Pointer);
Point puntomoved = e.GetCurrentPoint(CanvasVolume).Position;
double puntoX = puntomoved.X;
double puntoY = puntomoved.Y;
double raggio = 100;
double halfWidth = CanvasVolume.ActualHeight / 2;
double slashLength = Math.Sqrt((Math.Abs(puntoY - halfWidth) * Math.Abs(puntoY - halfWidth) + (Math.Abs(halfWidth - puntoX) * Math.Abs(halfWidth - puntoX))));
LeftPosition = CanvasVolume.ActualHeight / 2 + ((puntoX - halfWidth) * raggio / slashLength) - VolumePoint.Width/2;
TopPosition = puntoY - ((puntoY - halfWidth) * (slashLength - raggio) / slashLength) - VolumePoint.Width / 2;
};
PointerEventHandler released = null;
released = (s, args) =>
{
Point puntoreleas = e.GetCurrentPoint(CanvasVolume).Position;
CanvasVolume.PointerMoved -= moved;
CanvasVolume.PointerReleased -= released;
};
CanvasVolume.PointerMoved += moved;
CanvasVolume.PointerReleased += released;
谢谢你的回复。。。我想问最后一件事。给定找到的坐标,如何计算角度?可以使用方法来获得角度。首先得到两点之间的弦长,然后使用Asin方法得到角度。