Home Upgrade Search Memberlist Extras Hacker Tools Award Goals Help Wiki Contact

C# 

Smooth Vertical Scroll On FlowLayoutPanel [C#]

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

Thanks!  🤝
(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.
buy me a coffee eth:0x88621A52aa5Eb3b6503628369687111810186c58
(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.


Possibly Related Threads...
Thread / Author Replies Views Last Post
[C#] by draxyeeJun 5, 2020 02:58 PM 1 244 Jun 5, 2020 02:58 PM
Last Post: Porn
[C#] by MintoJul 19, 2018 07:25 PM 10 690 Jul 19, 2018 07:25 PM
Last Post: 6577657534735
[.NET] by monemdsNov 17, 2017 10:46 AM 2 214 Nov 17, 2017 10:46 AM
Last Post: monemds