2

次のコードがあります

public partial class MainWindow : Window
{
    public MainWindow() {
        InitializeComponent();
    }

    List<UIElement> ucs = new List<UIElement>();

    private void Window_PreviewMouseLeftButtonDown(object sender,
        MouseButtonEventArgs e)
    {
        ucs.Clear();

        Point p = e.GetPosition((UIElement)sender);

        VisualTreeHelper.HitTest(this, null,
            new HitTestResultCallback(MyHitTestCallback),
            new PointHitTestParameters(p));

        Console.WriteLine("ucs.Count = {0}", ucs.Count);

        foreach (var item in ucs)
        {
            Console.WriteLine("item: {0}", item.ToString());
        }
    }

    HitTestResultBehavior MyHitTestCallback(HitTestResult result)
    {
        ucs.Add(result.VisualHit as UIElement);
        return HitTestResultBehavior.Continue;
    }
}

これは私の窓です

<Window>
    <Grid>
        <my:UserControl1 HorizontalAlignment="Left" Margin="82,88,0,0" x:Name="userControl11" VerticalAlignment="Top" />
        <my:UserControl1 HorizontalAlignment="Left" Margin="168,166,0,0" x:Name="userControl12" VerticalAlignment="Top" />
        <my:UserControl1 HorizontalAlignment="Left" Margin="231,130,0,0" x:Name="userControl13" VerticalAlignment="Top" />
    </Grid>
</Window>

これが私のUCです

<UserControl>
    <Grid>
        <Label Content="Label" Height="44" HorizontalAlignment="Left" Name="label1" VerticalAlignment="Top" FontSize="20" FontWeight="Bold" Width="78" Background="#FF4B9FC4" BorderBrush="#FF020A0D" BorderThickness="1" />
    </Grid>
</UserControl>

これは、[ユーザー コントロール] をクリックしてから、2 つのユーザー コントロールの交差点をクリックしたときの出力です。

ucs.Count = 2
item: System.Windows.Controls.Border
item: System.Windows.Controls.Border
ucs.Count = 3
item: System.Windows.Controls.Border
item: System.Windows.Controls.Border
item: System.Windows.Controls.Border

なぜこれ?マウス インスタンスの下の UserControl はどこにありますか?

PS:
今、私がレーベルに持っているとき、BorderThickness = 0

ucs.Count = 3
item: System.Windows.Controls.TextBlock
item: System.Windows.Controls.Border
item: System.Windows.Controls.Border
ucs.Count = 3
item: System.Windows.Controls.TextBlock
item: System.Windows.Controls.Border
item: System.Windows.Controls.Border
4

1 に答える 1

2

UserControl1見えません。そのコンテンツは表示されますが、UserControl1インスタンス自体には独自のビジュアルがありません。(そして、決してそうなることはありません。ユーザー コントロールの仕事は、実際には他のものを含めることだけです。)

ヒット テストでは、ビジュアル ツリーに直接寄与する要素のみが報告されます。また、ヒット テストでは各要素が分離されていると見なされるため、純粋にコンテナーとして機能している要素は表示されません。(関連する事実として、ヒット テストでは、実際に描画されたピクセルのみが考慮されます。したがって、 をBorder設定した場所BorderBrushとゼロ以外のがあり、BorderThicknessがないBackground場合、ヒット テストでは境界線のアウトラインのみが考慮されます。ヒット - 境界線の内側のポイントは、内部に何も描画されていないため、境界線にヒットしたとは見なされません。

「このこと、またはこのことの内部の何か」スタイルのヒット テストを行う必要がある場合は、次のいずれかを行います。

  1. マウスのEnter/Leaveイベントを使用してください - これらのバブルは、目に見えないコンテナ要素でも発生します
  2. IsMouseOverまたは_
  3. 使用しているヒット テスト関数を使用し、ユーザー コントロールを最初の引数として渡し、ヒット テスト ポイントがユーザー コントロール内にあることを示すものとしてヒットを扱います。

3 番目のものはより複雑ですが、現在マウスの下にあるテスト ポイント以外のテスト ポイントをヒットする必要がある場合は、それを使用する必要があります。

于 2010-12-01T11:55:15.350 に答える