Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 径向滑块超宽带_C#_Uwp_Slider - Fatal编程技术网

C# 径向滑块超宽带

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="#

我想创建一个径向滑块。这是我写的代码,但我不明白我错在哪里

MainPage.xaml:

<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方法得到角度。