画布内的Dragged Images属性

本文关键字:Images 属性 Dragged 布内 | 更新日期: 2023-09-27 18:25:52

我的画布上有一个拖放功能,里面有很多图像。我想改变我刚刚点击的图像的不透明度,显然它起了作用。但是,当我单击2个或多个图像并更改不透明度时,所有单击的图像也会更改。我只想要我点击的最后一张图片被更改。

这是我的代码:

private void CanvasLayout_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    var image = e.Source as Image;
    if (image != null && CanvasLayout.CaptureMouse())
    {
        mousePosition = e.GetPosition(CanvasLayout);
        draggedImage = image;
        Panel.SetZIndex(draggedImage, 1);
        for (int i = 1; i < 9; i++)
        {
            if (draggedImage.Name == "Image" + i)
            {
                SelectComp_ComboBox.SelectedValue = "0" + (i + 1);
                Binding binding = new Binding
                {
                    Source = TransHidden_textBox,
                    Path = new PropertyPath("Text"),
                };
                draggedImage.SetBinding(ContentControl.OpacityProperty, binding);
            }
        }
    }
}
private void CanvasLayout_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
    if (draggedImage != null)
    {
        CanvasLayout.ReleaseMouseCapture();
        Panel.SetZIndex(draggedImage, 0);
        draggedImage = null;
    }
}

我认为问题是在这行draggedImage.SetBinding(ContentControl.OpacityProperty, binding);中,我需要将draggedImage更改为Image + i,但我不知道如何将string更改为Image

我该怎么做?有其他简单的方法来解决我的问题吗?

画布内的Dragged Images属性

从您提供的代码中还不清楚,但我猜您没有为不再拖动的项清除不透明度绑定。你应该打电话给

BindingOperations.ClearBinding(noLongerDraggedImage, ContentControl.OpacityProperty);

其中noLongerDraggedImage(显然)是对不再拖动的图像的引用。根据您的代码,您可以在处理拖动结束(无论是拖放还是取消)的方法中执行此操作,也可以在CanvasLayout_MouseLeftButtonDown方法开始时迭代除draggedImage之外的所有图像。请注意,在后一种情况下,最后拖动的图像在拖动另一个图像之前将具有不同的不透明度,这不是标准行为。

编辑

由于您已经提供了CanvasLayout_MouseLeftButtonUp方法的代码,据我所知,在其中放入前面提到的行:

private void CanvasLayout_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
    if (draggedImage != null)
    {
        CanvasLayout.ReleaseMouseCapture();
        Panel.SetZIndex(draggedImage, 0);
        BindingOperations.ClearBinding(draggedImage, ContentControl.OpacityProperty);
        draggedImage = null;
    }
}

应该会给你带来预期的结果。

编辑II

我不确定我是否理解你在这里到底想实现什么,所以也许我最好退一步回答你的问题——如何获得一个特定名称的图像。一种可能性是在Canvas.Children集合中找到它:

var name = "Image" + i.ToString();
var imageX = CanvasLayout.Children.OfType<Image>().Single(i => i.Name == name);

请注意,只有当您确定集合中只有一个具有给定名称的图像时,使用Single方法才是安全的,否则将引发异常。如果不是这样,您应该考虑使用SingleOrDefault(如果有一个或没有图像具有匹配的名称),或者FirstOrDefault(对于任何数量的具有匹配名称的图像)。