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イベントがトリガーされないことですImageSource(画像が読み込まれる)。Imagenull

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、長方形が表示されることです。

4

1 に答える 1

0

ここで修正すべき点がいくつかあります。

まず、XAML です。別のボタン内のボタン? 私はそれがどのように感じるべきか想像できません。次に、ZIndex. Image と Button は同じ Grid セルにあり、Image は Button の前に宣言されているため、冗長です。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>

すべての明らかなルールにより、ドラッグ可能な長方形が表示され、マウス ボタンを放すと消えます。

いいえ、グリッドからその Rectangle を実際に削除しない限り、そうすべきではありません。設定rect = nullはそれを行いません。

private void imgMain_MouseUp_1(object sender, MouseButtonEventArgs e)
{
    ImageGrid.Children.Remove(rect);
    rect = null;
}
于 2013-01-13T09:42:18.527 に答える