[英]Event handlers behaving abnormally
我正在使用以下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>
奇怪的是,如果Image
的ImageSource
不為null
(已加載圖像),則最外面的按鈕的MouseUp
, MouseDown
和MouseMove
事件甚至不會觸發。
我嘗試將它們移至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
的可見性時,確實會出現一個矩形。
這里有一些要解決的問題。
首先,您的XAML。 另一個按鈕中的一個按鈕? 我無法想象那種感覺。 然后是ZIndex
。 這是多余的,因為Image和Button在同一個Grid單元中,並且Image在Button之前聲明。 並且也不必在imgMain_MouseDown_1
新創建的Rectangle
上imgMain_MouseDown_1
。
奇怪的是,如果Image的ImageSource不為null,則最外面的按鈕的MouseUp,MouseDown和MouseMove事件甚至不會觸發。
這正是您所期望的,因為鼠標事件僅在控件的實際繪制區域(即命中測試成功的區域)上生成。 如果沒有實際內容(示例中沒有圖像),則命中測試將失敗。 您可以簡單地為網格分配透明背景,以確保命中測試始終成功:
<Grid x:Name="ImageGrid" Background="Transparent">
<Image x:Name="imgMain" />
<Button x:Name="rectBounds" Template="{StaticResource DesignerItemTemplate}" Visibility="Hidden" IsVisibleChanged="Button_IsVisibleChanged" />
</Grid>
按照所有明顯的規則,應該會出現一個可拖動的矩形,一旦松開鼠標按鈕,該矩形就會消失。
不,它不應該,除非您實際上從網格中刪除了該矩形。 設置rect = null
不會這樣做。
private void imgMain_MouseUp_1(object sender, MouseButtonEventArgs e)
{
ImageGrid.Children.Remove(rect);
rect = null;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.