C# 画布内的拖动图像属性
我有一个拖放功能在我的画布上,我有很多图像。我想改变我刚才点击的图像的不透明度,很明显它起作用了。但是,当我单击两个或多个图像并更改不透明度时,所有单击的图像也会更改。我只想要我点击的最后一张图片被改变 这是我的密码:C# 画布内的拖动图像属性,c#,wpf,canvas,drag-and-drop,opacity,C#,Wpf,Canvas,Drag And Drop,Opacity,我有一个拖放功能在我的画布上,我有很多图像。我想改变我刚才点击的图像的不透明度,很明显它起作用了。但是,当我单击两个或多个图像并更改不透明度时,所有单击的图像也会更改。我只想要我点击的最后一张图片被改变 这是我的密码: private void CanvasLayout_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { var image = e.Source as Image; if (image !=
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;
}
}
private void canvas布局\u MouseLeftButtonDown(对象发送器,MouseButtonEventArgs e)
{
var image=e.源作为图像;
if(image!=null&&CanvasLayout.CaptureMouse())
{
mousePosition=e.GetPosition(画布布局);
draggedImage=图像;
面板设置索引(draggedImage,1);
对于(int i=1;i<9;i++)
{
if(draggedImage.Name==“Image”+i)
{
选择comp_组合框。SelectedValue=“0”+(i+1);
绑定=新绑定
{
Source=TransHidden_文本框,
路径=新属性路径(“文本”),
};
draggedImage.SetBinding(ContentControl.OpacityProperty,绑定);
}
}
}
}
私有void画布布局_MouseLeftButtonUp(对象发送器,MouseButtonEventArgs e)
{
如果(draggedImage!=null)
{
CanvasLayout.ReleaseMouseCapture();
面板设置指数(draggedImage,0);
draggedImage=null;
}
}
我认为问题出在这行draggedImage.SetBinding(ContentControl.OpacityProperty,binding)
我需要将draggedImage
更改为Image+i
,但我不知道如何将字符串
更改为Image
我该怎么做?有没有其他简单的方法来解决我的问题 您提供的代码不清楚,但我猜您没有清除不再拖动的项目的不透明绑定。你应该打电话
BindingOperations.ClearBinding(noLongerDraggedImage, ContentControl.OpacityProperty);
为此,其中noLongerDraggedImage
显然是对不再拖动的图像的引用。根据您的代码,您可以通过处理拖动结束(即拖放或取消)的方法执行此操作,或者,您也可以在CanvasLayout\u MouseLeftButtonDown
方法开始时迭代除draggedImage
之外的所有图像。请注意,在后一种情况下,在拖动另一个图像之前,最后一个拖动的图像将具有不同的不透明度,这不是标准行为
编辑
由于您提供了CanvasLayout\u 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
collection中找到它:
var name = "Image" + i.ToString();
var imageX = CanvasLayout.Children.OfType<Image>().Single(i => i.Name == name);
var name=“Image”+i.ToString();
var imageX=CanvasLayout.Children.OfType().Single(i=>i.Name==Name);
请注意,只有在确定集合中只有一个具有给定名称的图像时,使用方法才是安全的,否则将引发异常。如果不是这样的话,你应该考虑使用-如果有一个或没有一个匹配名称的图像,或者——对于任意数量的具有匹配名称的图像。< /P>我用<代码> CavasLayExtMouSelftButoNoD/<代码>来编辑我的代码。我试图在
CanvasLayout\u MouseLeftButtonDown
中使用ClearBinding
,但由于图像为空,因此出现了错误。我仍然不明白该怎么做,很抱歉我的回复太晚了,我做到了,但是有了代码,透明度只有在我按住鼠标的时候才会改变。我认为最好的解决方案是通过字符串Image+I
获取draggedImage
名称,但我不知道如何实现。哦,我还以为这就是目标。。。好的,在我更新我的答案之前,请确认我的回答是否正确-你想在单击图像时对其应用自定义不透明度,并在单击另一个图像时将先前单击的图像恢复为正常?是的,是的,我的意思是,使用你的代码,当我单击另一个图像时,第一个图像将丢失新的不透明度值,因为绑定被清除,所以它不会被保存。