簡體   English   中英

事件處理程序行為異常

[英]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>

奇怪的是,如果ImageImageSource不為null (已加載圖像),則最外面的按鈕的MouseUpMouseDownMouseMove事件甚至不會觸發。

我嘗試將它們移至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新創建的RectangleimgMain_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM