NSTableRowView не вызывает правильно DrawBackground во время операций перетаскивания - PullRequest
0 голосов
/ 28 мая 2020

У меня есть NSTableView с набором строк. Есть два типа строк - заголовки и данные, которые отображаются по-разному.

Я перетаскиваю объект из своего приложения в строки данных. Перетаскивание работает полностью, и только строки данных принимают перетаскивание, но есть проблема с отображением.

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

Вот детали:

Если я перетащу мой объект в строку данных, а затем полностью от NSTableView, DrawDraggingDestinationFeedback вызывается при входе, а DrawBackground вызывается при выходе.

Если я перетаскиваю свой объект в строку, а затем вниз до следующей строки, DrawDraggingDestinationFeedback вызывается для верхней строки, затем, когда я двигаюсь вниз, DrawDraggingDestinationFeedback вызывается для нижней строки, но DrawBackground * не вызывается для первой строка (т.е. ее цвет фона не сбрасывается). В результате ОБЕИ строки выглядят так, будто они являются активными адресатами перетаскивания.

Как ни странно, вызывается последний DrawBackground при выходе из таблицы.

Showing missing calls to DrawDraggingDestinationFeedback

Вот мой собственный 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 ... любая быстрая помощь будет с благодарностью принята - я говорю на обоих]

...