3

コードまたは WPF に問題があるかどうかはわかりませんが、問題は次のとおりです。キャンバス内でカーソルを使用して描画できる小さなプログラムを作成したいと考えています。シンプルな WPF ウィンドウがあります。

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="475" Width="544">
<Grid>    
    <Grid.RowDefinitions>
        <RowDefinition Height="100px"></RowDefinition>
        <RowDefinition Height ="*"></RowDefinition>
        <RowDefinition Height="100px"></RowDefinition>
    </Grid.RowDefinitions>    
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="100px"></ColumnDefinition>
        <ColumnDefinition Width="*"></ColumnDefinition>
        <ColumnDefinition Width="100px"></ColumnDefinition>
    </Grid.ColumnDefinitions>
        <Canvas Grid.Row="1" Grid.Column="1"  Name="imageCanvas" MouseEnter="StackPanel_MouseEnter" MouseLeave="StackPanel_MouseLeave" Background="LightGray" 
                      MouseDown="StackPan_MouseDown" MouseUp="StackPan_MouseUp" MouseMove="StackPan_MouseMove">

        </Canvas>        
</Grid>

背景コードは次のとおりです。

   private void StackPan_MouseDown(object sender, MouseButtonEventArgs e)
    {
        draw = true;
    }

    private void StackPan_MouseUp(object sender, MouseButtonEventArgs e)
    {
        draw = false;
    }

    private void StackPan_MouseMove(object sender, MouseEventArgs e)
    {
        if (draw)
        {
            var pos = Mouse.GetPosition(imageCanvas);
            Rectangle rec = new Rectangle()
                    {
                        Width = 10,
                        Height = 10,
                        Fill = Brushes.Red,
                    };
            Canvas.SetTop(rec, pos.Y);
            Canvas.SetLeft(rec, pos.X);
            imageCanvas.Children.Add(rec);
        }

    }

そして、私にできることは次のとおりです: https://www.dropbox.com/s/7moq4p8f8f409b3/wpf_canvas.png

カーソルがキャンバスの外にあるときに StackPan_MouseMove が呼び出されるのはなぜですか?

この動作を確認できる実行可能ファイルは次のとおりです: https://www.dropbox.com/s/ye1w2j9chld2oif/WpfApplication1.exe

4

2 に答える 2

1

Canvas の Rectangle 子によって MouseMove イベントを取得します。

InkPresenter または InkCanvas を使用することをお勧めしますが (ユーザーの keyboardP が言ったように)、単純に Rectangles を非表示にしてヒット テストを行うこともできます。その後、入力イベントは生成されなくなります。

Rectangle rec = new Rectangle()
{
    Width = 10,
    Height = 10,
    Fill = Brushes.Red,
    IsHitTestVisible = false // here
};
于 2013-09-20T13:59:10.100 に答える
1

Canvas を Border コントロール内に配置し、BorderコントロールのClipToBoundsプロパティを に設定してみてくださいtrue

<Border ClipToBounds="true" Grid.Row="1" Grid.Column="1" >
    <Canvas Name="imageCanvas" MouseEnter="StackPanel_MouseEnter" MouseLeave="StackPanel_MouseLeave" Background="LightGray" 
            MouseDown="StackPan_MouseDown" MouseUp="StackPan_MouseUp" MouseMove="StackPan_MouseMove">
    </Canvas>
</Border>

少し異なる点として、InkPresenter / InkCanvasは、特定の理由でそれらを避けていない限り、あなたがやろうとしていることにより適しているようです。

于 2013-09-20T13:59:23.850 に答える