0

いくつかのコンテンツとLineキャンバス上のボーダーがあります。Border +の内容はドラッグ可能Lineで、Borderとともに移動するように更新されます。私の問題は、線が境界線の上にあるため、状況によってはコンテンツがブロックされることです。ZIndexを設定して、XAMLで順序を変更しようとしましたが、何の影響もありません。Line形状が変化し、何らかの理由で上部の画面に出力されるときに、が継続的にレンダリングされているためだと推測するのは危険です。これを回避する方法はありますか?

私のコードのいくつか

XAML

<Canvas x:Name="canvas"
            MouseDown="Canvas_MouseDown"
            MouseUp="Canvas_MouseUp"
            MouseMove="Canvas_MouseMove">
            <Border BorderBrush="Aqua" BorderThickness="3" Padding="3" Name="bdr"
Background="{StaticResource GradientBackground}" Canvas.ZIndex="99"
                MouseLeftButtonDown="MouseLeftBtnDown">
                <Border.RenderTransform>
                    <TranslateTransform />
                </Border.RenderTransform>
    <button/>
            </Border>
        </Canvas>
        <Polygon
            Canvas.ZIndex="98"
            Name="SpeechPoly"
            Stroke="Aqua" 
            StrokeThickness="2"
            Fill="{StaticResource GradientBackground}">
        </Polygon>

C#

private void Dragging()
{
...
point = bdr.TransformToAncestor(this).Transform(new Point(0, 0));
myPoints.RemoveAt(1);
myPoints.RemoveAt(1);

myPoints.Add(new Point(p.X, p.Y + 50));
myPoints.Add(new Point(p.X, p.Y + 25));
SpeechPoly.Points = myPoints;
}
4

1 に答える 1

0

クラップの回避策は、境界線のどこから線が来ているか(つまり、右側/左側、上/下)を判別し、境界線の周りに移動することです。

更新しました

if (p.X > myPoints[0].X)//right
{
    if (p.Y + bdr.ActualHeight> myPoints[0].Y)//lower
    {
        myPoints.Add(new Point(p.X, p.Y + 50));
        myPoints.Add(new Point(p.X, p.Y + 25));
    }
    else//higher
    {
        myPoints.Add(new Point(p.X, p.Y + bdr.ActualHeight- 50));
        myPoints.Add(new Point(p.X, p.Y + bdr.ActualHeight - 25));
    }
}
else if (p.X + bdr.ActualWidth > myPoints[0].X)//Middle
{
    if (p.Y + bdr.ActualHeight > myPoints[0].Y)//lower
    {
        myPoints.Add(new Point(p.X + (bdr.ActualWidth / 2) + 25, p.Y));
        myPoints.Add(new Point(p.X + (bdr.ActualWidth / 2), p.Y));
    }
    else if (p.Y + bdr.ActualHeight < myPoints[0].Y)//higher
    {
        myPoints.Add(new Point(p.X + (bdr.ActualWidth / 2) + 25, p.Y + bdr.ActualHeight));
        myPoints.Add(new Point(p.X + (bdr.ActualWidth / 2), p.Y + bdr.ActualHeight));
    }
}
else//left
{
    if (p.Y > myPoints[0].Y)//lower
    {
        myPoints.Add(new Point(p.X + bdr.ActualWidth, p.Y + 50));
        myPoints.Add(new Point(p.X + bdr.ActualWidth, p.Y + 25));
    }
    else//higher
    {
        myPoints.Add(new Point(p.X + bdr.ActualWidth, p.Y + 50));
        myPoints.Add(new Point(p.X + bdr.ActualWidth, p.Y + 25));
    }
}

解決

Lineボーダーと同じキャンバス内に私のものを持っていなければなりませんでした。今は明らかなようです...Vincentに感謝します!

于 2012-07-05T13:37:09.837 に答える