Вы можете создать его, используя Sprite.Create . У него есть параметр, который называется border.
Вот некоторый код, который я обработал для рисования визуального к битовому массиву. Вы можете адаптировать это к своим потребностям и тянуть битовый массив путем украшения UIElement, который представляет общего предка двух представлений списка. Отметьте использование FrameworkElement. TransformToAncestor для получения координат вложенного элемента с точки зрения элемента предка.
public static BitmapSource CreateBitmapFromElement(FrameworkElement element, Double dpiX, Double dpiY)
{
Size elementSize = new Size(element.ActualWidth, element.ActualHeight);
Visual root = GetAdornerDecoratorAncestor(element);
Rect elementBounds = element.TransformToAncestor(root).TransformBounds(new Rect(elementSize));
RenderTargetBitmap rtb = new RenderTargetBitmap((Int32)(elementBounds.Size.Width * dpiX / 96.0),
(Int32)(elementBounds.Size.Height * dpiY / 96.0),
dpiX,
dpiY,
PixelFormats.Pbgra32);
DrawingVisual dv = new DrawingVisual();
using (DrawingContext dc = dv.RenderOpen())
{
VisualBrush vb = new VisualBrush(root);
vb.ViewboxUnits = BrushMappingMode.Absolute;
vb.Stretch = Stretch.None;
vb.Viewbox = elementBounds;
dc.DrawRectangle(vb, null, new Rect(new Point(), elementBounds.Size));
}
rtb.Render(dv);
return rtb;
}
public static Visual GetAdornerDecoratorAncestor(DependencyObject obj)
{
while(obj != null && !(obj is AdornerDecorator))
{
obj = VisualTreeHelper.GetParent(obj);
}
return obj as AdornerDecorator;
}
Хорошо, Вы могли попытаться брать Визуальный элемент, и установить это - предпосылки к visualbrush Вашего ListItem, и анимируйте это к другому полю списка. Можно ожидать завершенного события раскадровки, чтобы на самом деле сделать переключатель. Если бы это было я, то я анимировал бы от одного поля только к краю другого. Если переключатель происходит достаточно быстро, это должно выглядеть довольно бесшовным пользователю. Нахождение точного положения того, где объект, как предполагается, входит в поле списка, было бы довольно сложно на основе любых правил сортировки/фильтрации, которые что Вы имеете.
Если эти два поля списков всегда находятся в том же положении, Вы могли бы попытаться анимировать объект, по которому дважды щелкают, к предопределенному месту, скажем, на полпути между старым списком и новым списком. Затем выполните код, чтобы переместить объект в новый список, но использовать стиль, который сразу запускает анимацию на том объекте, начинающем его с того предопределенного местоположения и анимирующем к его местоположению в новом списке. Необходимо было бы, вероятно, настроить начальное смещение нового объекта во времени выполнения на основе того, где это вставляется в список.