У меня есть NSTableView с набором строк. Есть два типа строк - заголовки и данные, которые отображаются по-разному.
Я перетаскиваю объект из своего приложения в строки данных. Перетаскивание работает полностью, и только строки данных принимают перетаскивание, но есть проблема с отображением.
Я использую настраиваемый NSTableRowView, и я ожидаю увидеть, что если я перетащу свой объект над строкой данных , то должен быть вызван DrawDraggingDestinationFeedback
(это так) для рисования моего собственного фона, используемого во время операций перетаскивания. Если я затем перетащу свой объект из строки данных, я ожидаю, что будет вызван DrawBackground
(это ИНОГДА), чтобы перерисовать мой стандартный фон.
Вот детали:
Если я перетащу мой объект в строку данных, а затем полностью от NSTableView, DrawDraggingDestinationFeedback
вызывается при входе, а DrawBackground
вызывается при выходе.
Если я перетаскиваю свой объект в строку, а затем вниз до следующей строки, DrawDraggingDestinationFeedback
вызывается для верхней строки, затем, когда я двигаюсь вниз, DrawDraggingDestinationFeedback
вызывается для нижней строки, но DrawBackground
* не вызывается для первой строка (т.е. ее цвет фона не сбрасывается). В результате ОБЕИ строки выглядят так, будто они являются активными адресатами перетаскивания.
Как ни странно, вызывается последний DrawBackground
при выходе из таблицы.

Вот мой собственный NSTableRowView:
public class CustomSelectionRowView : NSTableRowView
{
/// The log object
private static Logger log = LogManager.GetCurrentClassLogger();
private string type;
private DataItem ditem;
public CustomSelectionRowView(string type, DataItem ditem = null) : base()
{
this.type = type;
this.ditem = ditem;
DraggingDestinationFeedbackStyle = NSTableViewDraggingDestinationFeedbackStyle.Regular;
SelectionHighlightStyle = NSTableViewSelectionHighlightStyle.Regular;
}
public override void DrawDraggingDestinationFeedback(CGRect dirtyRect)
{
log.Debug(ditem.title);
if (type == "Data")
{
// This can accept a drag-drop
var color = NSColor.Gray;
var p = NSGraphicsContext.CurrentContext.GraphicsPort;
p.SetFillColor(color.CGColor);
p.FillRect(dirtyRect);
}
else
base.DrawDraggingDestinationFeedback(dirtyRect);
}
public override void DrawBackground(CGRect dirtyRect)
{
log.Debug(ditem.title);
if (type == "Data")
{
// We definitely have a Data block
var color = NSColor.FromName("MainPaneDataBackground");
var p = NSGraphicsContext.CurrentContext.GraphicsPort;
p.SetFillColor(color.CGColor);
p.FillRect(dirtyRect);
}
else
base.DrawBackground(dirtyRect);
}
}
У кого-нибудь есть идеи, как обойти это? Большое спасибо.
[ps обратите внимание, что хотя мой код здесь C # / Xamarin ... любая быстрая помощь будет с благодарностью принята - я говорю на обоих]