の上部に表示されるようにしたい:以下
は、問題を説明するいくつかのサンプルコードです
ScrollViewのような子どもたちはビューの外側に描画していないようですね。 Grid
の内容が正確自体の大きさである限られたサイズを持っていますが、それは、スクロール可能なので、ScrollViewer
の内容は全く限られたサイズを持っていないので、
これは、Grid
、の子要素を好きではありませんScrollViewer
は常にその内部でレンダリングされます。
...が、私は
正直であるために、私はドラッグアンドドロップを実装するためにCanvas.ZIndex
を使用するために正しい方向ではないと思い青い枠線がグリッドの上部に表示させたいです異なる親の間のジェスチャー。 Canvas.ZIndex値は、値が設定されている最も近い親キャンバス要素によって解釈されます。この値は、子要素が重なっている場合の描画順序を明示的に定義するために使用されます。この場合、Grid
とScrollViewer
は同じ親を持ちますが、Canvas
は異なる親を持っています。後ろ
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" x:Name="rootGrid"
PointerPressed="rootGrid_PointerPressed"
PointerReleased="rootGrid_PointerReleased">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="200"></ColumnDefinition>
<ColumnDefinition Width="200"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Canvas x:Name="canvas" Grid.Column="1" Background="Wheat">
<Border BorderThickness="2" BorderBrush="Red" Width="50" Height="50" />
<Ellipse Width="50" Height="50" VerticalAlignment="Top" Fill="Red" />
</Canvas>
<ScrollViewer x:Name="scrollViewer" Grid.Column="0"
VerticalScrollMode="Enabled" VerticalScrollBarVisibility="Hidden"
Background="LightBlue">
<Canvas Width="100" x:Name="canvasInsideScrollViewer">
<Border BorderThickness="2" BorderBrush="Blue" Width="50" Height="50" VerticalAlignment="Bottom" />
</Canvas>
</ScrollViewer>
</Grid>
コード::私はあなたにこの機能を実装する方法与えることができます
は、ここであなたが見ることができるように
public Page20()
{
this.InitializeComponent();
this.Loaded += Page20_Loaded;
}
private void Page20_Loaded(object sender, RoutedEventArgs e)
{
gridRect = canvas.TransformToVisual(rootGrid).TransformBounds(new Rect(0.0, 0.0, canvas.ActualWidth, canvas.ActualHeight));
scrollViewerRect = scrollViewer.TransformToVisual(rootGrid).TransformBounds(new Rect(0.0, 0.0, scrollViewer.ActualWidth, scrollViewer.ActualHeight));
}
private Rect gridRect;
private Rect scrollViewerRect;
private FrameworkElement MoveElement;
private void rootGrid_PointerPressed(object sender, PointerRoutedEventArgs e)
{
var pointer = e.GetCurrentPoint(rootGrid);
if (gridRect.Left <= pointer.Position.X && pointer.Position.X <= gridRect.Right &&
gridRect.Top <= pointer.Position.Y && pointer.Position.Y <= gridRect.Bottom)
{
foreach (var childElement in canvas.Children)
{
var element = childElement as FrameworkElement;
Rect childBounds = element.TransformToVisual(rootGrid).TransformBounds(new Rect(0.0, 0.0, element.ActualWidth, element.ActualHeight));
if (childBounds.Left <= pointer.Position.X && pointer.Position.X <= childBounds.Right &&
childBounds.Top <= pointer.Position.Y && pointer.Position.Y <= childBounds.Bottom)
{
MoveElement = element;
canvas.Children.Remove(element);
}
}
}
else if (scrollViewerRect.Left <= pointer.Position.X && pointer.Position.X <= scrollViewerRect.Right &&
scrollViewerRect.Top <= pointer.Position.Y && pointer.Position.Y <= scrollViewerRect.Bottom)
{
foreach (var childElement in canvasInsideScrollViewer.Children)
{
var element = childElement as FrameworkElement;
Rect childBounds = element.TransformToVisual(rootGrid).TransformBounds(new Rect(0.0, 0.0, element.ActualWidth, element.ActualHeight));
if (childBounds.Left <= pointer.Position.X && pointer.Position.X <= childBounds.Right &&
childBounds.Top <= pointer.Position.Y && pointer.Position.Y <= childBounds.Bottom)
{
MoveElement = element;
canvasInsideScrollViewer.Children.Remove(element);
}
}
}
}
private void rootGrid_PointerReleased(object sender, PointerRoutedEventArgs e)
{
var pointer = e.GetCurrentPoint(rootGrid);
if (MoveElement != null)
{
if (gridRect.Left <= pointer.Position.X && pointer.Position.X <= gridRect.Right &&
gridRect.Top <= pointer.Position.Y && pointer.Position.Y <= gridRect.Bottom)
{
var canvasPointer = e.GetCurrentPoint(canvas);
canvas.Children.Add(MoveElement);
Canvas.SetLeft(MoveElement, canvasPointer.Position.X);
Canvas.SetTop(MoveElement, canvasPointer.Position.Y);
}
else if (scrollViewerRect.Left <= pointer.Position.X && pointer.Position.X <= scrollViewerRect.Right &&
scrollViewerRect.Top <= pointer.Position.Y && pointer.Position.Y <= scrollViewerRect.Bottom)
{
var scrollviewPointer = e.GetCurrentPoint(canvasInsideScrollViewer);
canvasInsideScrollViewer.Children.Add(MoveElement);
Canvas.SetLeft(MoveElement, scrollviewPointer.Position.X);
Canvas.SetTop(MoveElement, scrollviewPointer.Position.Y);
}
}
MoveElement = null;
}
を、私はそう、Canvas
に2列目のGrid
を変更しました要素はマウスポイントとして絶対位置にレンダリングできます。ここに私のデモのレンダリング画像は、次のとおりです。 
ここで最も紛らわしい部分は、あなたが別の親コントロール間UIElement
を翻訳したいということですが、中にも(ドラッグアンドドロップしたい)あなたのBorder
Sを置く場合rootGrid
、Grid
、ScrollViewer
、Border
の親が同じ場合は、CustomBehaviorControlのXAMLBehaviorsSampleに続き、ドラッグ&ドロップ作業を完了できます。
ありがとう、ありがとう、zインデックスの説明をありがとう。私は、これが私が望むドラッグアンドドロップ機能を実装するための最良のソリューションではないかもしれないことに気付きました。私の質問から明らかでないかもしれないことは、要素がドラッグされている間に見えるようにすることです。これが問題の発生場所です。 –
@ JonatanBlomが、同じ親コントロールにドラッグ&ドロップできますか?レンダリングされたレイアウトとまったく違いはありません。 –