WPF使用VisualTreeHelper進行復雜命中測驗
一、簡介
接上篇的簡單命中測驗,添加VisualTreeHelper復雜命中測驗,
二、代碼案例
我在一個畫板上在不同的位置放了3個圓形,給他們放置了不同的位置和填充不同的顏色,我們通過命中測驗判斷如果滑鼠在圓上抬起了,我們讀取當前圓的填充顏色,
XAML:
<Grid MouseLeftButtonUp="Grid_MouseLeftButtonUp" MouseRightButtonUp="Grid_MouseRightButtonUp"> <Canvas> <Ellipse Canvas.Left="30" Canvas.Top="200" Width="130" Height="130" Fill="Blue"/> <Ellipse Opacity="0.6" Canvas.Left="70" Canvas.Top="50" Width="130" Height="130" Fill="Violet"/> <Ellipse Opacity="0.6" Canvas.Left="150" Canvas.Top="50" Width="130" Height="130" Fill="Orange"/> <Ellipse Opacity="0.6" Canvas.Left="110" Canvas.Top="0" Width="130" Height="130" Fill="Red"/> <Ellipse Canvas.Left="220" Canvas.Top="100" Width="130" Height="130" Fill="Yellow"/> <TextBlock Canvas.Left="0" Canvas.Top="0" Text="抬起滑鼠左右鍵,開始對滑鼠所在點進行命中測驗" /> </Canvas> </Grid>
后臺邏輯:
#region 左鍵簡單命中測驗 private void Grid_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) { //最上層顏色 var ellipse = GetVisual(e.GetPosition(this)); MessageBox.Show(ellipse?.Fill?.ToString()); } private Ellipse GetVisual(Point point) { HitTestResult hitResult = VisualTreeHelper.HitTest(this, point); var ellipse = hitResult.VisualHit as Ellipse; return ellipse; } #endregion #region 右鍵復雜命中測驗 private void Grid_MouseRightButtonUp(object sender, MouseButtonEventArgs e) { Point pt = e.GetPosition((UIElement)sender); //我們定義一個10*10大小的幾何 EllipseGeometry expandedHitTestArea = new EllipseGeometry(pt, 10.0, 10.0); var ellipses = GetVisual(expandedHitTestArea); StringBuilder stringBuilder = new StringBuilder(); foreach (var item in ellipses) { //右擊彈出所有層疊的顏色 stringBuilder.Append(item.Fill.ToString() + ","); } MessageBox.Show(stringBuilder.ToString()); } private HitTestResultBehavior HitTestCallback(HitTestResult result) { GeometryHitTestResult geometryResult = (GeometryHitTestResult)result; Ellipse visual = result.VisualHit as Ellipse; if (visual != null) { hits.Add(visual); } return HitTestResultBehavior.Continue; } List<Ellipse> hits = new List<Ellipse>(); private List<Ellipse> GetVisual(Geometry region) { hits.Clear(); GeometryHitTestParameters parameters = new GeometryHitTestParameters(region); HitTestResultCallback callback = new HitTestResultCallback(this.HitTestCallback); //第一個引數是我們要在什么容器內查找(我們現在是在整個window), //第二個引數是篩選回呼值的方法,我們目前不需要, //第三個引數是命中測驗回呼結果, //第四個引數是需要檢測的區域, VisualTreeHelper.HitTest(this, null, callback, parameters); return hits; } #endregion
三、運行效果
如下圖右鍵點擊小星星處,彈出三種HTML顏色:

如下圖左鍵點擊小星星處,僅彈出一種HTML顏色:

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/288647.html
標籤:.NET技术
上一篇:自定義Nuget包的技巧一二
