我正在使用以下WPF
<Button Style="{DynamicResource NoChromeButton}" x:Name="cmdImage" Grid.Row="1" Margin="10" MouseDoubleClick="cmdImage_MouseDoubleClick" MouseDown="imgMain_MouseDown_1" MouseMove="imgMain_MouseMove_1" MouseUp="imgMain_MouseUp_1">
<Grid x:Name="ImageGrid">
<Image x:Name="imgMain" Panel.ZIndex="0" />
<Button x:Name="rectBounds" Template="{StaticResource DesignerItemTemplate}" Visibility="Hidden" IsVisibleChanged="Button_IsVisibleChanged" Panel.ZIndex="1" />
</Grid>
</Button>
奇怪的是,最外层按钮的MouseUp
,MouseDown
和MouseMove
事件甚至不会触发ImageSource
Image
}不是null
(图片被加载)。
我尝试将它们移到Image
控件。它们确实触发,但表现出乎意料。
private void imgMain_MouseDown_1(object sender, MouseButtonEventArgs e)
{
startPoint = e.GetPosition(ImageGrid);
rect = new Rectangle
{
Margin =
new Thickness(e.GetPosition(ImageGrid).X, e.GetPosition(ImageGrid).Y,
ImageGrid.ActualWidth - e.GetPosition(ImageGrid).X,
ImageGrid.ActualHeight - e.GetPosition(ImageGrid).Y),
Stroke = Brushes.Black,
StrokeThickness = 1.0
};
ImageGrid.Children.Add(rect);
Panel.SetZIndex(rect, 2);
}
private void imgMain_MouseMove_1(object sender, MouseEventArgs e)
{
if (e.LeftButton == MouseButtonState.Released || rect == null)
return;
Point pos = e.GetPosition(ImageGrid);
double x = Math.Min(pos.X, startPoint.X);
double y = Math.Min(pos.Y, startPoint.Y);
double w = Math.Max(pos.X, startPoint.X) - x;
double h = Math.Max(pos.Y, startPoint.Y) - y;
rect.Margin = new Thickness(x, y, ImageGrid.ActualWidth - x - w, ImageGrid.ActualHeight - y - h);
}
private void imgMain_MouseUp_1(object sender, MouseButtonEventArgs e)
{
rect = null;
}
根据所有明显的规则,应该出现一个可拖动的矩形,并在松开鼠标按钮后消失。它没有。有趣的是,当我更改rectBounds
的可见性时,会出现一个矩形。
答案 0 :(得分:0)
这里有一些事情需要解决。
首先,你的XAML。另一个按钮内的按钮?我无法想象应该如何感受。然后是ZIndex
。这是多余的,因为Image和Button在同一个Grid单元格中,而Image在Button之前声明。而且也没有必要在Rectangle
中设置新创建的imgMain_MouseDown_1
。
奇怪的部分是MouseUp,MouseDown和MouseMove事件 如果ImageSource的话,最外面的按钮甚至不会触发 图片不为空。
这正是您所期望的,因为鼠标事件仅在实际绘制的控件的那些区域上生成,换言之,hit testing成功。如果没有实际内容(示例中没有图像),则命中测试失败。您可以简单地为网格指定透明背景,以确保命中测试始终成功:
<Grid x:Name="ImageGrid" Background="Transparent">
<Image x:Name="imgMain" />
<Button x:Name="rectBounds" Template="{StaticResource DesignerItemTemplate}" Visibility="Hidden" IsVisibleChanged="Button_IsVisibleChanged" />
</Grid>
不,它不应该,除非您实际从网格中删除该Rectangle。设置根据所有明显的规则,应该出现一个可拖动的矩形,和 一旦松开鼠标键就会消失。
rect = null
不会那样做。
private void imgMain_MouseUp_1(object sender, MouseButtonEventArgs e)
{
ImageGrid.Children.Remove(rect);
rect = null;
}