2016-02-12 1 views
1

Im пытается реализовать панель, содержащую множество кнопок и панелей с сенсорным интерфейсом в C#. В частности, меня интересует функция прокрутки. Предполагается, что приложение будет работать на планшете Windows 10, который частично выполняет эту функцию (Т.е. если вы скользят пальцами по фону полосы прокрутки, прокрутка выполняется. Однако, если жест начинается на дочернем элементе панели, он не действует Выполняя те же жесты с помощью мыши, независимо от того, где это, не имеет никакого эффекта.) К сожалению, у меня нет возможности переключиться с winforms на приложение WPF. Прямо сейчас я реализовал функциональность с помощью прозрачной панели (переписывая метод OnPaintBackground()), который я накладываю поверх фактической панели прокрутки. Он принимает события мыши вниз/перемещение/вверх и преобразует их в прокрутку действий и пересылает клики дочерним элементам панели прокрутки. Это решение работает нормально, но очень медленно (отставание). Интересно, есть ли исправление к нему или какое-то другое, лучшее решение.сенсорная прокрутка для winforms в C#

using System; 
using System.Collections.Generic; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace ETNA 
{ 
    public class TransparentPanel : Panel 
    { 
     bool mouseDown = false; 
     bool isScrolling = false; 
     FlowLayoutPanel flap; 
     Point mouseDownPos = new Point(); 
     int curserYPosBeforeScroll; 
     Point initScrollPos = new Point(); 

     public TransparentPanel(FlowLayoutPanel flap) 
     { 
      this.flap = flap; 
      Location = flap.Location; 
      Size = flap.Size; 
     } 

     protected override CreateParams CreateParams 
     { 
      get 
      { 
       CreateParams cp = base.CreateParams; 
       cp.ExStyle |= 0x00000020; // WS_EX_TRANSPARENT 
       return cp; 
      } 
     } 

     protected override void OnMouseDown(MouseEventArgs e) 
     { 
      base.OnMouseDown(e); 
      mouseDown = true; 
      mouseDownPos.X = e.X; 
      mouseDownPos.Y = e.Y; 
      curserYPosBeforeScroll = Cursor.Position.Y; 
      initScrollPos = new Point(0, -flap.AutoScrollPosition.Y); // XXX unclear why negtion is necessary 
     } 

     protected override void OnMouseUp(MouseEventArgs e) 
     { 
      base.OnMouseUp(e); 
      isScrolling = false; 
      mouseDown = false; 
     } 

     protected override void OnMouseMove(MouseEventArgs e) 
     { 
      base.OnMouseMove(e); 

      if (mouseDown) 
      { 
       isScrolling = true; 

       int initMousePos = curserYPosBeforeScroll; 
       int currMousePos = Cursor.Position.Y; 
       int autoScrollPos = initScrollPos.Y + initMousePos - currMousePos; 
       autoScrollPos = clamp(autoScrollPos, 0, flap.VerticalScroll.Maximum); 
       flap.AutoScrollPosition = new Point(initScrollPos.X, autoScrollPos); 
       flap.Refresh(); 
       Refresh(); 
      } 
     } 

     private static int clamp(int value, int min, int max) 
     { 
      return value < min ? min : value > max ? max : value; 
     } 

     protected override void OnMouseClick(MouseEventArgs e) 
     { 
      base.OnMouseClick(e); 
      Point clickPos = new Point(e.X, e.Y); 
      if (!isScrolling && mouseDownPos.Equals(clickPos)) 
      { 
       foreach (Control c in flap.Controls) 
       { 
        if (c.Bounds.Contains(mouseDownPos)) 
        { 
         if (c.GetType().Equals(typeof(UserButton))) 
         { 
          ((Button)c).PerformClick(); 
         } 
         else if (c.GetType().Equals(typeof(ProductPanel))) 
         { 
          ((ProductPanel)c).virtualClick(this, e); 
         } 
        } 
       } 
      } 
     } 

     // skipping the paint Background method makes the panel transparent 
     protected override void OnPaintBackground(PaintEventArgs e) 
     { 
      //base.OnPaintBackground(e); 
     } 
    } 
} 
+1

Можете ли вы обновить свой вопрос тем, что вы пробовали? – Takarii

ответ

1

Это не совсем ответ, но слишком длинный комментарий.
Я столкнулся с подобной проблемой и сумел убедить своего босса пойти в wpf после множества попыток управлять панорамированием в приложении winforms.
Но - в моем приложении прокручиваемый контейнер также прозрачный, поэтому все это выглядело довольно ужасно.

Однако Мое решение для обработки панорамирования было другим решением, а затем вашим, поэтому вы могли бы воспользоваться моим опытом. I've found this gem online, что позволило мне обрабатывать жесты панорамирования в моем коде C#, это также может помочь вам.

+0

Мне не удалось заставить все жесты работать, но этот код закончен, вы можете обнаружить жесты с ним на windows fomrs, работающем на планшете. – SubqueryCrunch

 Смежные вопросы

  • Нет связанных вопросов^_^