2013-01-13 119 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; 
} 
相關問題