2013-01-13 120 views
0

我用下面的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> 

怪异的部分是MouseUpMouseDown,并且MouseMove最外面的按钮的事件,甚至不触发当且仅当Image ISN的ImageSource 't 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

这里有几件事要解决。

首先,你的XAML。另一个按钮内的按钮?我无法想象应该如何感觉。然后ZIndex。这是多余的,因为图像和按钮位于同一个网格单元格中,并且图像在按钮之前声明。而且也没有必要在imgMain_MouseDown_1中新建Rectangle

怪异的部分是, 最外面的按钮鼠标松开,的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> 

通过所有明显的规则,可拖动矩形应该出现,并 消失,一旦你放开鼠标按钮。

不,它不应该,除非你真的从网格中删除矩形。设置rect = null不会这样做。

private void imgMain_MouseUp_1(object sender, MouseButtonEventArgs e) 
{ 
    ImageGrid.Children.Remove(rect); 
    rect = null; 
} 
相关问题