C# WPF-Shy头

C# WPF-Shy头,c#,wpf,scrollviewer,C#,Wpf,Scrollviewer,我需要一些建议。您知道如何在WPF中执行与图中类似的操作。这在UWP中称为Shy头。 谢谢你的建议 这里有一些代码可以帮助您开始。它并不完美,但我认为它包含了你需要的主要部分(这是你可能会找到的东西)。当然,目前的状态并不是近乎完美,并且有一个平均的架构,但无论如何。。。代码如下: XAML: <Window x:Class="scrollviewerShyHeader.MainWindow" xmlns="http://schemas.microsoft.com/winfx/20

我需要一些建议。您知道如何在WPF中执行与图中类似的操作。这在UWP中称为Shy头。 谢谢你的建议


这里有一些代码可以帮助您开始。它并不完美,但我认为它包含了你需要的主要部分(这是你可能会找到的东西)。当然,目前的状态并不是近乎完美,并且有一个平均的架构,但无论如何。。。代码如下:

XAML:

<Window x:Class="scrollviewerShyHeader.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:scrollviewerShyHeader"
    mc:Ignorable="d"
    Title="MainWindow" Height="400" Width="800"
    >
<Window.DataContext>
    <local:ViewModel/>
</Window.DataContext>
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition MaxHeight="{Binding GridTopRowHeight}"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <ScrollViewer x:Name="MyShyScrollViewer" ScrollChanged="ScrollChanged"
                  Grid.Row="1">
      <StackPanel>
        <Label Content="2323 343 34324 234 234" />
        <Label Content="2323 343 34324 234 234" />
        <Label Content="2323 343 34324 234 234" />
        <Label Content="2323 343 34324 234 234" />
        <Label Content="2323 343 34324 234 234" />
        <Label Content="2323 343 34324 234 234" />
        <Label Content="2323 343 34324 234 234" />
        <Label Content="2323 343 34324 234 234" />
        <Label Content="2323 343 34324 234 234" />
        <Label Content="2323 343 34324 234 234" />
        <Label Content="2323 343 34324 234 234" />
        <Label Content="2323 343 34324 234 234" />
        <Label Content="2323 343 34324 234 234" />
        <Label Content="2323 343 34324 234 234" />
        <Label Content="2323 343 34324 234 234" />
        <Label Content="2323 343 34324 234 234" />
        <Label Content="2323 343 34324 234 234" />
        <Label Content="2323 343 34324 234 234" />
        <Label Content="2323 343 34324 234 234" />
        </StackPanel>
    </ScrollViewer>
    <Label Content="Header Header Header Header Header Header Header"
           Background="LightCoral" Height="{Binding Path=ShyHeight}"
           VerticalAlignment="Top" Opacity="{Binding Path=ShyOpacity}" 
           Grid.Row="{Binding HeaderGridRow}"
           />
  </Grid>
</Window>
using System.Windows;
using System.Windows.Controls;


namespace scrollviewerShyHeader
{
    public partial class MainWindow : Window
    {
        private void ScrollChanged(object sender, ScrollChangedEventArgs e)
        {
            var vm = (ViewModel)this.DataContext;
            vm.ScrollViewerOffset = e.VerticalOffset;
        }
    }
}
using System.Diagnostics;

namespace scrollviewerShyHeader
{
    class ViewModel : ViewModelBase
    {

        public ViewModel()
        {
            ShyHeight = 100;
            ShyOpacity = 1.0;
            HeaderGridRow = 0;
            GridTopRowHeight = 100;
        }


        private int shyHeight;
        public int ShyHeight
        {
            get { return shyHeight; }
            set
            {
                shyHeight = value;
                RaisePropertyChanged();
            }
        }

        private double shyOpacity;
        public double ShyOpacity
        {
            get { return shyOpacity; }
            set
            {
                shyOpacity = value;
                RaisePropertyChanged();
            }
        }


        private double scrollerViewerOffset;
        public double ScrollViewerOffset
        {
            get { return scrollerViewerOffset; }
            set
            {
                Debug.Print(value.ToString());
                scrollerViewerOffset = value;
                if (scrollerViewerOffset > 0)
                {
                    ShyOpacity = 0.7;
                    ShyHeight = 80;
                    HeaderGridRow = 1;
                    GridTopRowHeight = 0;
                } else if (scrollerViewerOffset == 0)
                {
                    ShyOpacity = 1;
                    ShyHeight = 100;
                    HeaderGridRow = 0;
                    GridTopRowHeight = 100;
                }
            }
        }

        private int headerGridRow;
        public int HeaderGridRow
        {
            get { return headerGridRow; }
            set
            {
                headerGridRow = value;
                RaisePropertyChanged();
            }
        }

        private int gridTopRowHeight;

        public int GridTopRowHeight
        {
            get { return gridTopRowHeight; }
            set { gridTopRowHeight = value; RaisePropertyChanged();}
        }

    }
}
using System.ComponentModel;
using System.Runtime.CompilerServices;


namespace scrollviewerShyHeader
{
    public abstract class ViewModelBase : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        protected virtual void RaisePropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}
和视图模型:

<Window x:Class="scrollviewerShyHeader.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:scrollviewerShyHeader"
    mc:Ignorable="d"
    Title="MainWindow" Height="400" Width="800"
    >
<Window.DataContext>
    <local:ViewModel/>
</Window.DataContext>
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition MaxHeight="{Binding GridTopRowHeight}"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <ScrollViewer x:Name="MyShyScrollViewer" ScrollChanged="ScrollChanged"
                  Grid.Row="1">
      <StackPanel>
        <Label Content="2323 343 34324 234 234" />
        <Label Content="2323 343 34324 234 234" />
        <Label Content="2323 343 34324 234 234" />
        <Label Content="2323 343 34324 234 234" />
        <Label Content="2323 343 34324 234 234" />
        <Label Content="2323 343 34324 234 234" />
        <Label Content="2323 343 34324 234 234" />
        <Label Content="2323 343 34324 234 234" />
        <Label Content="2323 343 34324 234 234" />
        <Label Content="2323 343 34324 234 234" />
        <Label Content="2323 343 34324 234 234" />
        <Label Content="2323 343 34324 234 234" />
        <Label Content="2323 343 34324 234 234" />
        <Label Content="2323 343 34324 234 234" />
        <Label Content="2323 343 34324 234 234" />
        <Label Content="2323 343 34324 234 234" />
        <Label Content="2323 343 34324 234 234" />
        <Label Content="2323 343 34324 234 234" />
        <Label Content="2323 343 34324 234 234" />
        </StackPanel>
    </ScrollViewer>
    <Label Content="Header Header Header Header Header Header Header"
           Background="LightCoral" Height="{Binding Path=ShyHeight}"
           VerticalAlignment="Top" Opacity="{Binding Path=ShyOpacity}" 
           Grid.Row="{Binding HeaderGridRow}"
           />
  </Grid>
</Window>
using System.Windows;
using System.Windows.Controls;


namespace scrollviewerShyHeader
{
    public partial class MainWindow : Window
    {
        private void ScrollChanged(object sender, ScrollChangedEventArgs e)
        {
            var vm = (ViewModel)this.DataContext;
            vm.ScrollViewerOffset = e.VerticalOffset;
        }
    }
}
using System.Diagnostics;

namespace scrollviewerShyHeader
{
    class ViewModel : ViewModelBase
    {

        public ViewModel()
        {
            ShyHeight = 100;
            ShyOpacity = 1.0;
            HeaderGridRow = 0;
            GridTopRowHeight = 100;
        }


        private int shyHeight;
        public int ShyHeight
        {
            get { return shyHeight; }
            set
            {
                shyHeight = value;
                RaisePropertyChanged();
            }
        }

        private double shyOpacity;
        public double ShyOpacity
        {
            get { return shyOpacity; }
            set
            {
                shyOpacity = value;
                RaisePropertyChanged();
            }
        }


        private double scrollerViewerOffset;
        public double ScrollViewerOffset
        {
            get { return scrollerViewerOffset; }
            set
            {
                Debug.Print(value.ToString());
                scrollerViewerOffset = value;
                if (scrollerViewerOffset > 0)
                {
                    ShyOpacity = 0.7;
                    ShyHeight = 80;
                    HeaderGridRow = 1;
                    GridTopRowHeight = 0;
                } else if (scrollerViewerOffset == 0)
                {
                    ShyOpacity = 1;
                    ShyHeight = 100;
                    HeaderGridRow = 0;
                    GridTopRowHeight = 100;
                }
            }
        }

        private int headerGridRow;
        public int HeaderGridRow
        {
            get { return headerGridRow; }
            set
            {
                headerGridRow = value;
                RaisePropertyChanged();
            }
        }

        private int gridTopRowHeight;

        public int GridTopRowHeight
        {
            get { return gridTopRowHeight; }
            set { gridTopRowHeight = value; RaisePropertyChanged();}
        }

    }
}
using System.ComponentModel;
using System.Runtime.CompilerServices;


namespace scrollviewerShyHeader
{
    public abstract class ViewModelBase : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        protected virtual void RaisePropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}
viewbasemodel:

<Window x:Class="scrollviewerShyHeader.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:scrollviewerShyHeader"
    mc:Ignorable="d"
    Title="MainWindow" Height="400" Width="800"
    >
<Window.DataContext>
    <local:ViewModel/>
</Window.DataContext>
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition MaxHeight="{Binding GridTopRowHeight}"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <ScrollViewer x:Name="MyShyScrollViewer" ScrollChanged="ScrollChanged"
                  Grid.Row="1">
      <StackPanel>
        <Label Content="2323 343 34324 234 234" />
        <Label Content="2323 343 34324 234 234" />
        <Label Content="2323 343 34324 234 234" />
        <Label Content="2323 343 34324 234 234" />
        <Label Content="2323 343 34324 234 234" />
        <Label Content="2323 343 34324 234 234" />
        <Label Content="2323 343 34324 234 234" />
        <Label Content="2323 343 34324 234 234" />
        <Label Content="2323 343 34324 234 234" />
        <Label Content="2323 343 34324 234 234" />
        <Label Content="2323 343 34324 234 234" />
        <Label Content="2323 343 34324 234 234" />
        <Label Content="2323 343 34324 234 234" />
        <Label Content="2323 343 34324 234 234" />
        <Label Content="2323 343 34324 234 234" />
        <Label Content="2323 343 34324 234 234" />
        <Label Content="2323 343 34324 234 234" />
        <Label Content="2323 343 34324 234 234" />
        <Label Content="2323 343 34324 234 234" />
        </StackPanel>
    </ScrollViewer>
    <Label Content="Header Header Header Header Header Header Header"
           Background="LightCoral" Height="{Binding Path=ShyHeight}"
           VerticalAlignment="Top" Opacity="{Binding Path=ShyOpacity}" 
           Grid.Row="{Binding HeaderGridRow}"
           />
  </Grid>
</Window>
using System.Windows;
using System.Windows.Controls;


namespace scrollviewerShyHeader
{
    public partial class MainWindow : Window
    {
        private void ScrollChanged(object sender, ScrollChangedEventArgs e)
        {
            var vm = (ViewModel)this.DataContext;
            vm.ScrollViewerOffset = e.VerticalOffset;
        }
    }
}
using System.Diagnostics;

namespace scrollviewerShyHeader
{
    class ViewModel : ViewModelBase
    {

        public ViewModel()
        {
            ShyHeight = 100;
            ShyOpacity = 1.0;
            HeaderGridRow = 0;
            GridTopRowHeight = 100;
        }


        private int shyHeight;
        public int ShyHeight
        {
            get { return shyHeight; }
            set
            {
                shyHeight = value;
                RaisePropertyChanged();
            }
        }

        private double shyOpacity;
        public double ShyOpacity
        {
            get { return shyOpacity; }
            set
            {
                shyOpacity = value;
                RaisePropertyChanged();
            }
        }


        private double scrollerViewerOffset;
        public double ScrollViewerOffset
        {
            get { return scrollerViewerOffset; }
            set
            {
                Debug.Print(value.ToString());
                scrollerViewerOffset = value;
                if (scrollerViewerOffset > 0)
                {
                    ShyOpacity = 0.7;
                    ShyHeight = 80;
                    HeaderGridRow = 1;
                    GridTopRowHeight = 0;
                } else if (scrollerViewerOffset == 0)
                {
                    ShyOpacity = 1;
                    ShyHeight = 100;
                    HeaderGridRow = 0;
                    GridTopRowHeight = 100;
                }
            }
        }

        private int headerGridRow;
        public int HeaderGridRow
        {
            get { return headerGridRow; }
            set
            {
                headerGridRow = value;
                RaisePropertyChanged();
            }
        }

        private int gridTopRowHeight;

        public int GridTopRowHeight
        {
            get { return gridTopRowHeight; }
            set { gridTopRowHeight = value; RaisePropertyChanged();}
        }

    }
}
using System.ComponentModel;
using System.Runtime.CompilerServices;


namespace scrollviewerShyHeader
{
    public abstract class ViewModelBase : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        protected virtual void RaisePropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

你试图实现同样的目标是什么?请共享示例代码。您尝试过microsoft expression blend吗?动画可以在里面完成。