輸入命中測試在其RenderTransform
屬性中具有較大縮放因子的Path元素上產生不正確的結果。已轉換路徑上的命中測試不正確
以下XAML定義了一個帶實心圓的路徑和一個Hand
遊標。
<Canvas Background="LightGray">
<Path StrokeThickness="0" Fill="Blue" Cursor="Hand">
<Path.Data>
<EllipseGeometry RadiusX=".5" RadiusY=".5" Center="1,1"/>
</Path.Data>
<Path.RenderTransform>
<ScaleTransform ScaleX="150" ScaleY="150"/>
</Path.RenderTransform>
</Path>
</Canvas>
如下面的圖像中可以看出,出現在光標Hand
雖然其位置在形狀以外的方式。
在更大的路徑和較小的縮放因子的問題消失,光標行爲與預期。
<Canvas Background="LightGray">
<Path StrokeThickness="0" Fill="Blue" Cursor="Hand">
<Path.Data>
<EllipseGeometry RadiusX="50" RadiusY="50" Center="100,100"/>
</Path.Data>
<Path.RenderTransform>
<ScaleTransform ScaleX="1.5" ScaleY="1.5"/>
</Path.RenderTransform>
</Path>
</Canvas>
執行顯命中測試這樣
private void Canvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
var canvas = (UIElement)sender;
var hitElement = canvas.InputHitTest(e.GetPosition(canvas));
Trace.TraceInformation("hitElement = {0}", hitElement);
}
在畫布上的鼠標事件處理
給出了同樣的結果不正確。在縮放的路徑之外清楚地單擊鼠標仍然返回Path作爲命中元素。
還值得一提的是,問題並未出現在Silverlight中。
現在的問題是:這種行爲的原因是什麼?如何避免?請注意,我不能簡單地更改我的路徑元素的原始大小,因此諸如「不使用大比例因子」的答案不會有幫助。
我當前的解決方法是不通過RenderTransform轉換路徑,而是轉換數據(通過將轉換應用於Geometry.Transform
屬性)。但是由於可能有複雜的填充(例如使用ImageBrush),我也必須轉換填充畫筆(不僅涉及設置它們的轉換,還涉及它們的視口)。此外,實際轉換不僅僅是縮放,而且是一個MatrixTransform,它也可以旋轉和轉換。
也值得注意的是,這個問題也出現在其他幾何圖形和附加轉換中。例如,帶有矩形幾何的轉換路徑顯示類似的錯誤行爲。
錯誤與大規模因素:
<Canvas Background="LightGray">
<Path StrokeThickness="0" Fill="Blue" Cursor="Hand">
<Path.Data>
<RectangleGeometry Rect=".5,.5,1,1"/>
</Path.Data>
<Path.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="150" ScaleY="150"/>
<RotateTransform Angle="45" CenterX="150" CenterY="150"/>
<TranslateTransform X="100"/>
</TransformGroup>
</Path.RenderTransform>
</Path>
</Canvas>
糾正小規模的因素:
<Canvas Background="LightGray">
<Path StrokeThickness="0" Fill="Blue" Cursor="Hand">
<Path.Data>
<RectangleGeometry Rect="50,50,100,100"/>
</Path.Data>
<Path.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="1.5" ScaleY="1.5"/>
<RotateTransform Angle="45" CenterX="150" CenterY="150"/>
<TranslateTransform X="100"/>
</TransformGroup>
</Path.RenderTransform>
</Path>
</Canvas>
解決辦法:不要使用大規模因素*。不,開玩笑吧。如果將'RenderTranform'更改爲'LayoutTransform',會發生嗎? –
已經嘗試過,雖然LayoutTransform不會是一個選項。無論如何,它的行爲與LayoutTransform相同。 – Clemens
您是否考慮過使用'RectangleGeometry.Transform'而不是'Path。[Render | Layout] Transform'?由於您可以訪問幾何圖形本身,因此可以讓Shape創建已轉換的幾何圖形,然後點擊測試應該更加自然。 – heltonbiker