1

UserControl を DataTemplate として使用する ListView があります。

<ListView>
    <ListView.ItemTemplate>
        <DataTemplate>
            <views:TaskerInfoView />
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

TaskerInfoView ユーザーコントロール内に配置されたボタンの絶対画面座標が必要です。

私はこのコードで試しました:

var newButtonPoint = button.PointToScreen(new Point(0, 0));

しかし、「このビジュアルはPresentationSourceに接続されていません」という例外を受け取りました。ボタンがDataTemplate内にあるため、ビジュアル要素に接続されていないと思います。

更新私はその例外を受け取った理由を発見しました:PointToScreen呼び出しの前に、リストビューのItemsSourceであるObersvableCollection内にアイテムを移動します:

this._taskList.Move(currentIndex, currentIndex - 1);  // _taskList is the ObservableCollection<>
var newButtonPoint = button.PointToScreen(new Point(0, 0));

を削除するObservableCollection<>.Moveと、PointToScreen は正しく機能します。

ObservableCollection<>.Move内部的にアイテムを削除し、別のアイテムを新しい位置に挿入すると思います。buttonTreeVisual から実際に切断されている削除された要素への参照が含まれているため、例外が発生します

4

1 に答える 1