【问题标题】:Dragged Images Property inside canvas画布内的拖动图像属性
【发布时间】:2016-03-11 19:28:21
【问题描述】:

我的画布中有一个拖放功能,其中有很多图像。我想改变我刚刚点击的图像的不透明度,显然它有效。但是,当我单击 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

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

【问题讨论】:

    标签: c# wpf canvas drag-and-drop opacity


    【解决方案1】:

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

    BindingOperations.ClearBinding(noLongerDraggedImage, ContentControl.OpacityProperty);
    

    为了做到这一点,noLongerDraggedImage (显然)是对不再拖动的图像的引用。根据您的代码,您可以在处理拖动结束的方法中执行此操作(无论是拖放还是取消),或者,您可以在 draggedImage 方法的开头迭代除 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;
        }
    }
    

    应该会给你预期的结果。

    编辑二

    我不确定我是否完全理解您在这里想要完成的工作,所以也许我最好退后一步并回答您的问题 - 如何获取具有特定名称的图像。一种可能性是在Canvas.Children 集合中找到它:

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

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

    【讨论】:

    • 我使用提供的CanvasLayout_MouseLeftButtonDown 编辑我的代码。我尝试在CanvasLayout_MouseLeftButtonDown 中使用ClearBinding,但由于图像为空而出现错误。我还是不明白怎么做
    • 抱歉回复晚了,我做到了,但是使用该代码时,不透明度只有在我按住鼠标时才会改变。我认为最好的解决方案是通过字符串Image + i 获取draggedImage 名称,但我不知道该怎么做。
    • 哦,我以为这是目标...好吧,所以在我更新我的答案之前,请确认我是否正确 - 您想在单击图像时对图像应用自定义不透明度,然后单击另一个将先前单击的恢复为正常?
    • 是的,我的意思是,使用您的代码,当我单击另一张图片时,第一张图片会丢失不透明度的新值,就像它没有保存一样,因为绑定已被清除。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多