代码之家  ›  专栏  ›  技术社区  ›  Patrik

WPF-Shy标题

  •  0
  • Patrik  · 技术社区  · 7 年前

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

    enter image description here

    1 回复  |  直到 7 年前
        1
  •  1
  •   Jan    7 年前

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

    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;
            }
        }
    }
    

    以及viewmodel:

    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();}
            }
    
        }
    }
    

    viewbasemodel:

    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));
            }
        }
    }