Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.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#_Wpf_Wpf Controls_Ellipse - Fatal编程技术网

C# 鼠标向下移动表示椭圆不圆';行不通

C# 鼠标向下移动表示椭圆不圆';行不通,c#,wpf,wpf-controls,ellipse,C#,Wpf,Wpf Controls,Ellipse,我有个问题。我有一个椭圆:椭圆1,它位于画布:画布1的内部。 当我点击ellipse1时,它的填充从白色变为淡紫色。当我点击画布的另一部分时,椭圆将移动到那里。这很有效 当我再次单击椭圆1时,其填充颜色不会改变 怎么了?… 我有一个ellipse1的XAML代码: <Ellipse Height="35" HorizontalAlignment="Left" Name="ellipse1" Stroke="Black" VerticalAlignment="Top" Width="70"

我有个问题。我有一个椭圆:椭圆1,它位于画布:画布1的内部。 当我点击ellipse1时,它的填充从白色变为淡紫色。当我点击画布的另一部分时,椭圆将移动到那里。这很有效

当我再次单击椭圆1时,其填充颜色不会改变

怎么了?…

我有一个ellipse1的XAML代码:

<Ellipse Height="35" HorizontalAlignment="Left" Name="ellipse1" Stroke="Black" VerticalAlignment="Top" Width="70" Fill="White" StrokeThickness="3" Canvas.Left="71" Canvas.Top="70" MouseDown="pion_alb1_md"/>
这是canvas1的XAML代码:

<Canvas Name="piese_canvas" MouseDown="mouse_down_canvas_piese" Background="#43FCFFEB">
.......
</Canvas>
private void mouse_down_canvas_piese(object sender, EventArgs e)
{
    if (ellipse1.Fill == Brushes.PaleVioletRed)
    {            
        Point c = Mouse.GetPosition(piese_canvas);

        if ((c.X > 81) && (c.Y < 311) && (c.X <160) && (c.Y >191))
        {
            Canvas.SetLeft(ellipse1, 72);
            Canvas.SetTop(ellipse1, 241);
            ellipse1.Fill = Brushes.White;
            Canvas.SetLeft(ellipse5, -12);
            Canvas.SetTop(ellipse5, 241);
        }
    }
}

.......
…下面是画布的C部分1:

<Canvas Name="piese_canvas" MouseDown="mouse_down_canvas_piese" Background="#43FCFFEB">
.......
</Canvas>
private void mouse_down_canvas_piese(object sender, EventArgs e)
{
    if (ellipse1.Fill == Brushes.PaleVioletRed)
    {            
        Point c = Mouse.GetPosition(piese_canvas);

        if ((c.X > 81) && (c.Y < 311) && (c.X <160) && (c.Y >191))
        {
            Canvas.SetLeft(ellipse1, 72);
            Canvas.SetTop(ellipse1, 241);
            ellipse1.Fill = Brushes.White;
            Canvas.SetLeft(ellipse5, -12);
            Canvas.SetTop(ellipse5, 241);
        }
    }
}
private void mouse\u down\u canvas\u piese(对象发送方,事件参数e)
{
if(ellipse1.Fill==画笔.PaleVioletRed)
{            
点c=鼠标.GetPosition(点击画布);
如果((c.X>81)和&(c.Y<311)和&(c.X 191))
{
Canvas.SetLeft(ellipse1,72);
Canvas.SetTop(ellipse1,241);
ellipse1.Fill=画笔。白色;
Canvas.SetLeft(ellipse5,-12);
Canvas.SetTop(ellipse5241);
}
}
}

我已将您的代码复制到一个新项目中,它的工作方式与您的描述不同

当我点击椭圆时,它会改变颜色。当我点击画布时,
if((c.X>81)&&&(c.Y<311)&&(c.X<160)&&(c.Y>191))
行返回false,因此椭圆永远不会移动。这可能是因为我在窗口上的所有内容都是一个包含椭圆的画布,而画布没有设置位置

所以我不能重现你的问题。您能否提供有关画布或窗口中的内容的更多信息

编辑:

好的,我现在明白问题了。尝试向这两个方法添加断点。椭圆上的任何单击也由画布处理(WPFs路由事件的一部分)。当椭圆移动时,对它的任何单击都在画布的特殊区域的边界内,因此它会被更改为Palevoletred(因为单击了椭圆),然后立即更改为白色(因为在正确的位置单击了画布)

尝试将椭圆单击处理程序更改为:

private void pion_alb1_md(object sender, RoutedEventArgs e)
{
    if (ellipse1.Fill == Brushes.White)
    {
        ellipse1.Fill = Brushes.PaleVioletRed;
    }
    else
    {
        ellipse1.Fill = Brushes.White;
    }
    e.Handled = true;
}
重点是:

  • EventArgs现在路由为EventArgs。这将公开iHandled属性
  • e、 IsHandled=真。这将停止其他事件处理程序(例如画布单击处理程序)的触发

我已将您的代码复制到一个新项目中,它的工作方式与您的描述不同

当我点击椭圆时,它会改变颜色。当我点击画布时,
if((c.X>81)&&&(c.Y<311)&&(c.X<160)&&(c.Y>191))
行返回false,因此椭圆永远不会移动。这可能是因为我在窗口上的所有内容都是一个包含椭圆的画布,而画布没有设置位置

所以我不能重现你的问题。您能否提供有关画布或窗口中的内容的更多信息

编辑:

好的,我现在明白问题了。尝试向这两个方法添加断点。椭圆上的任何单击也由画布处理(WPFs路由事件的一部分)。当椭圆移动时,对它的任何单击都在画布的特殊区域的边界内,因此它会被更改为Palevoletred(因为单击了椭圆),然后立即更改为白色(因为在正确的位置单击了画布)

尝试将椭圆单击处理程序更改为:

private void pion_alb1_md(object sender, RoutedEventArgs e)
{
    if (ellipse1.Fill == Brushes.White)
    {
        ellipse1.Fill = Brushes.PaleVioletRed;
    }
    else
    {
        ellipse1.Fill = Brushes.White;
    }
    e.Handled = true;
}
重点是:

  • EventArgs现在路由为EventArgs。这将公开iHandled属性
  • e、 IsHandled=真。这将停止其他事件处理程序(例如画布单击处理程序)的触发

如下图所示更改椭圆鼠标下手柄。如果不设置
e.Handled=true
,鼠标事件也将由画布处理,之后将立即调用
mouse\u down\u canvas\u piese
。由于移动椭圆后,椭圆几乎完全位于“活动区域”,因此
填充
将重置为
白色

您可以通过调试发现这一点。还要注意,椭圆永远不会移动到另一个位置,因为新的
Top
Left
值被硬编码为241和72

private void pion_alb1_md(object sender, RoutedEventArgs e)
{
    if (ellipse1.Fill == Brushes.White)
    {
        ellipse1.Fill = Brushes.PaleVioletRed;
    }
    else
    {
        ellipse1.Fill = Brushes.White;
    }
    e.Handled = true;
}

更改椭圆鼠标向下手柄,如下所示。如果不设置
e.Handled=true
,鼠标事件也将由画布处理,之后将立即调用
mouse\u down\u canvas\u piese
。由于移动椭圆后,椭圆几乎完全位于“活动区域”,因此
填充
将重置为
白色

您可以通过调试发现这一点。还要注意,椭圆永远不会移动到另一个位置,因为新的
Top
Left
值被硬编码为241和72

private void pion_alb1_md(object sender, RoutedEventArgs e)
{
    if (ellipse1.Fill == Brushes.White)
    {
        ellipse1.Fill = Brushes.PaleVioletRed;
    }
    else
    {
        ellipse1.Fill = Brushes.White;
    }
    e.Handled = true;
}

只需点击正确的位置。这是一个相当小的区域。只需点击正确的位置。这是一个相当小的区域。啊,我没有看到这个!哎呀,我没看到这个!哎呀。