Hack Forums
[C#] Smooth Vertical Scroll On FlowLayoutPanel [C#] - Printable Version

+- Hack Forums (https://hackforums.net)
+-- Forum: Tech (https://hackforums.net/forumdisplay.php?fid=444)
+--- Forum: Coding (https://hackforums.net/forumdisplay.php?fid=151)
+---- Forum: Software Development (https://hackforums.net/forumdisplay.php?fid=118)
+---- Thread: [C#] Smooth Vertical Scroll On FlowLayoutPanel [C#] (/showthread.php?tid=5857503)



Smooth Vertical Scroll On FlowLayoutPanel [C#] - FryPan - Jul 3, 2018

How would I do this? I've tried searching for ways to do this with no working methods.

Thanks!  🤝


RE: Smooth Vertical Scroll On FlowLayoutPanel [C#] - itcorp - Jul 4, 2018

(Jul 3, 2018 04:21 PM)FryPan Wrote:  How would I do this? I've tried searching for ways to do this with no working methods.

Thanks!  🤝

Why not use wpf,in wpf WrapPanel has similar behaviour as WinForms FlowLayoutPanel.
Here is one solution that might help you in wpf.You need to put the panel in ScrollViewer

Code
<ScrollViewer x:Name="hfSV" HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Hidden">
                        <WrapPanel x:Name="pnlHF"/>
</ScrollViewer>

up scroll
Code
var scrollViwer = POSUIHelper.GetScrollViewer(hfSV) as ScrollViewer;
   if (scrollViwer != null)
   {
      scrollViwer.ScrollToVerticalOffset(scrollViwer.VerticalOffset - 5);
   }

down scroll
Code
var scrollViwer = POSUIHelper.GetScrollViewer(hfSV) as ScrollViewer;
if (scrollViwer != null)
{
    scrollViwer.ScrollToVerticalOffset(scrollViwer.VerticalOffset + 5);
}

Code
public static class POSUIHelper
    {
        public static DependencyObject GetScrollViewer(DependencyObject o)
        {
            if (o is ScrollViewer)
            { return o; }

            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(o); i++)
            {
                var child = VisualTreeHelper.GetChild(o, i);

                var result = GetScrollViewer(child);
                if (result == null)
                {
                    continue;
                }
                else
                {
                    return result;
                }
            }
            return null;
        }

        public static T FindChild<T>(DependencyObject parent, string childName) where T : DependencyObject
        {
            if (parent == null) return null;

            T foundChild = null;

            int childrenCount = VisualTreeHelper.GetChildrenCount(parent);
            for (int i = 0; i < childrenCount; i++)
            {
                var child = VisualTreeHelper.GetChild(parent, i);
                T childType = child as T;
                if (childType == null)
                {
                    foundChild = FindChild<T>(child, childName);

                    if (foundChild != null) break;
                }
                else if (!string.IsNullOrEmpty(childName))
                {
                    var frameworkElement = child as FrameworkElement;
                    if (frameworkElement != null && frameworkElement.Name == childName)
                    {
                        foundChild = (T)child;
                        break;
                    }
                }
                else
                {
                    foundChild = (T)child;
                    break;
                }
            }

            return foundChild;
        }

        public static T FindVisualParent<T>(DependencyObject child) where T : DependencyObject
        {
            DependencyObject parentObject = VisualTreeHelper.GetParent(child);
            if (parentObject == null) return null;

            T parent = parentObject as T;
            if (parent != null)
            {
                return parent;
            }
            else
            {
                return FindVisualParent<T>(parentObject);
            }
        }
    }
And u can and ScrollChangedEventArgs to track VerticalOffset changes,and you can use this solution for horizontal scrolling.


RE: Smooth Vertical Scroll On FlowLayoutPanel [C#] - FryPan - Jul 4, 2018

(Jul 4, 2018 12:45 PM)itcorp Wrote:  Why not use wpf,in wpf WrapPanel has similar behaviour as WinForms FlowLayoutPanel.
Here is one solution that might help you in wpf.You need to put the panel in ScrollViewer

Code
<ScrollViewer x:Name="hfSV" HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Hidden">
                       <WrapPanel x:Name="pnlHF"/>
</ScrollViewer>

up scroll
Code
  var scrollViwer = POSUIHelper.GetScrollViewer(hfSV) as ScrollViewer;
  if (scrollViwer != null)
  {
     scrollViwer.ScrollToVerticalOffset(scrollViwer.VerticalOffset - 5);
  }

down scroll
Code
var scrollViwer = POSUIHelper.GetScrollViewer(hfSV) as ScrollViewer;
if (scrollViwer != null)
{
   scrollViwer.ScrollToVerticalOffset(scrollViwer.VerticalOffset + 5);
}

Code
   public static class POSUIHelper
   {
       public static DependencyObject GetScrollViewer(DependencyObject o)
       {
           if (o is ScrollViewer)
           { return o; }

           for (int i = 0; i < VisualTreeHelper.GetChildrenCount(o); i++)
           {
               var child = VisualTreeHelper.GetChild(o, i);

               var result = GetScrollViewer(child);
               if (result == null)
               {
                   continue;
               }
               else
               {
                   return result;
               }
           }
           return null;
       }

       public static T FindChild<T>(DependencyObject parent, string childName) where T : DependencyObject
       {
           if (parent == null) return null;

           T foundChild = null;

           int childrenCount = VisualTreeHelper.GetChildrenCount(parent);
           for (int i = 0; i < childrenCount; i++)
           {
               var child = VisualTreeHelper.GetChild(parent, i);
               T childType = child as T;
               if (childType == null)
               {
                   foundChild = FindChild<T>(child, childName);

                   if (foundChild != null) break;
               }
               else if (!string.IsNullOrEmpty(childName))
               {
                   var frameworkElement = child as FrameworkElement;
                   if (frameworkElement != null && frameworkElement.Name == childName)
                   {
                       foundChild = (T)child;
                       break;
                   }
               }
               else
               {
                   foundChild = (T)child;
                   break;
               }
           }

           return foundChild;
       }

       public static T FindVisualParent<T>(DependencyObject child) where T : DependencyObject
       {
           DependencyObject parentObject = VisualTreeHelper.GetParent(child);
           if (parentObject == null) return null;

           T parent = parentObject as T;
           if (parent != null)
           {
               return parent;
           }
           else
           {
               return FindVisualParent<T>(parentObject);
           }
       }
   }
And u can and ScrollChangedEventArgs to track VerticalOffset changes,and you can use this solution for horizontal scrolling.

Found it really hard to get in to WPF, but will definitely give it another go soon.