これは、私が実装しているいくつかのカスタム ドラッグ アンド ドロップ機能に関連しています。
ContentPresenter をミックスに投入するまで、すべてが非常にうまく機能していました。
ContentPresenter を含む Window があります。
この ContentPresenter のコンテンツは、動的にポップ インおよびポップ アウトされるさまざまなユーザー コントロールにバインドされています。
私が抱えている問題は、この CONtentPresenter が存在するメイン ウィンドウの外側に存在するコントロールに対して、ContentPresenter 内に含まれるコントロールで TransformToVisual を実行する必要があることです。
概要:
Window -> MyCanvas と呼ばれる Canvas -> ContenPresenter (Content Presenter には MyListView と呼ばれる ListView が含まれます)
MyListView.TransformToVisual(MyCanvas) を呼び出したい。
「指定されたビジュアルとこのビジュアルは共通の祖先を共有していないため、2 つのビジュアル間に有効な変換がありません。」というエラーが表示されるため、これは許可されていないようです。
以下のスニペットに関する注意: 1. _targetBoundingBoxes は、ドラッグを受け入れる UIElements のリストです。 2. ドラッグしながら、キャンバスを画面上で移動します (_canvasThatIsBeingDraggedAround)。3. 移動中、現在の MousePosition が _dropTargets のいずれかに該当するかどうかを照会しています。
失敗しているコード スニペット:
_targetBoundingBoxes.Clear();
foreach (var item in _dropTargets)
{
GeneralTransform t = item.TransformToVisual(_canvasThatIsBeingDraggedAround);
Rect _dropBoundingBox = t.TransformBounds(new Rect(0, 0, item.RenderSize.Width, item.RenderSize.Height));
_targetBoundingBoxes.Add(item, _dropBoundingBox);
}
<Window>
<StackPanel>
<Button Margin="0,50,0,0" Height="50"/>
<ContentPresenter Name="HI" Content="{Binding Blah}"/>
</StackPanel>
</Window>
//Create a canvas which will be used as the dragged adorner. Canvas is used since you can set the Left and Top positions.
if (_topWindow.FindName("adornerLayer") == null)
{
//grab the existingContent
UIElement existingContent = (UIElement)_topWindow.Content;
//create a Grid wrapper around the entire window content so we can add the new canvas adornerLayer as a child in addition to the existing content
Grid nonLayoutCanvas = new Grid(); nonLayoutCanvas.VerticalAlignment = VerticalAlignment.Stretch; nonLayoutCanvas.HorizontalAlignment = HorizontalAlignment.Stretch;
//create the hidden Canvas that we will draw to and move around the screen
Canvas adornerCanvas = new Canvas(); adornerCanvas.Visibility = Visibility.Collapsed; adornerCanvas.Name = "adornerLayer";
adornerCanvas.Effect = new DropShadowEffect() { ShadowDepth = 5, BlurRadius = 5, Color = Colors.Silver };
//reset the content to the nonLayout Canvas
_topWindow.Content = nonLayoutCanvas;
//add the original content and the new canvas to the grid above
nonLayoutCanvas.Children.Add(existingContent);
nonLayoutCanvas.Children.Add(adornerCanvas);
_topWindow.RegisterName("adornerLayer", adornerCanvas);
}
_canvasThatIsBeingDraggedAround = (Canvas)_topWindow.FindName("adornerLayer");