如何修复数据网格组标题的滚动问题

发布于 2024-10-11 03:45:22 字数 6637 浏览 4 评论 0 原文

嗨,我正在寻找水平对齐我的组标题。我已经成功地做到了这一点,但现在的问题是,如果我水平滚动,我的组标题也会滚动。如何解决这个问题。我希望我的组标题被修复,并且只有我的组标题被修复。滚动的内容

我的代码如下。

Xaml

<Window.Resources>
    <local:Animals x:Key="animals"/>       

    <CollectionViewSource x:Key="cvs" Source="{Binding Source={StaticResource animals}, Path=AnimalList}">
        <CollectionViewSource.SortDescriptions>
            <scm:SortDescription PropertyName="Category" />
            <scm:SortDescription PropertyName="Name" />
        </CollectionViewSource.SortDescriptions>
        <CollectionViewSource.GroupDescriptions>
            <PropertyGroupDescription PropertyName="Category"/>
        </CollectionViewSource.GroupDescriptions>
    </CollectionViewSource>

    <DataTemplate x:Key="animalTemplate">
        <TextBlock Text="{Binding Path=Name}" Foreground="MediumSeaGreen"/>
    </DataTemplate>
    <Style TargetType="{x:Type HeaderedContentControl}">
        <Setter Property="Control.Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type HeaderedContentControl}">
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="*"/>
                            <RowDefinition Height="Auto"/>
                        </Grid.RowDefinitions>
                        <StackPanel Orientation="Horizontal">
                            <ContentPresenter
                            Content="{TemplateBinding HeaderedContentControl.Header}"
                            ContentTemplate="{TemplateBinding HeaderedContentControl.HeaderTemplate}"
                            ContentSource="Header" VerticalAlignment="Center">
                            </ContentPresenter>
                            <ContentPresenter                             
                            Content="{TemplateBinding ContentControl.Content}"
                            ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}" />
                        </StackPanel>

                        <Separator HorizontalAlignment="Stretch" Grid.Row="1" Margin="-1"/>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>

<Border Margin="30" BorderBrush="Blue" BorderThickness="2" Padding="10">
    <Controls:DataGrid ItemsSource="{Binding Source={StaticResource cvs}}" 
       ItemTemplate="{StaticResource animalTemplate}" Name="ic" Width="200" >

        <Controls:DataGrid.GroupStyle>
            <GroupStyle>
                <GroupStyle.ContainerStyle>
                    <Style TargetType="{x:Type GroupItem}">
                        <Setter Property="Margin" Value="0,0,0,5"/>
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="{x:Type GroupItem}">
                                    <HeaderedContentControl BorderBrush="#FFA4B97F" BorderThickness="0,0,0,1" Margin="0,0,0,5" >
                                        <HeaderedContentControl.Header>
                                            <TextBlock FontSize="12" FontWeight="Bold" Width="100"
                                                                Text="{Binding Name}" Margin="5,0,0,0"/>
                                        </HeaderedContentControl.Header>
                                        <HeaderedContentControl.Content>
                                            <ItemsPresenter/>
                                        </HeaderedContentControl.Content>
                                    </HeaderedContentControl>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </GroupStyle.ContainerStyle>
            </GroupStyle>
        </Controls:DataGrid.GroupStyle>
    </Controls:DataGrid>
</Border>

代码

  public class Animal
{
    private string name;

    public string Name
    {
        get { return name; }
        set { name = value; }
    }

    private Category category;

    public Category Category
    {
        get { return category; }
        set { category = value; }
    }

    public Animal(string name, Category category)
    {
        this.name = name;
        this.category = category;
    }
}

public enum Category
{
    Amphibians,
    Bears,
    BigCats,
    Canines,
    Primates,
    Spiders,
}

public class Animals
{
    private List<Animal> animalList;

    public IEnumerable<Animal> AnimalList
    {
        get { return animalList; }
    }

    public Animals()
    {
        animalList = new List<Animal>();
        animalList.Add(new Animal("California Newt", Category.Amphibians));
        animalList.Add(new Animal("Giant Panda", Category.Bears));
        animalList.Add(new Animal("Coyote", Category.Canines));
        animalList.Add(new Animal("Golden Silk Spider", Category.Spiders));
        animalList.Add(new Animal("Mandrill", Category.Primates));
        animalList.Add(new Animal("Black Bear", Category.Bears));
        animalList.Add(new Animal("Jaguar", Category.BigCats));
        animalList.Add(new Animal("Bornean Gibbon", Category.Primates));
        animalList.Add(new Animal("African Wildcat", Category.BigCats));
        animalList.Add(new Animal("Arctic Fox", Category.Canines));
        animalList.Add(new Animal("Tomato Frog", Category.Amphibians));
        animalList.Add(new Animal("Grizzly Bear", Category.Bears));
        animalList.Add(new Animal("Dingo", Category.Canines));
        animalList.Add(new Animal("Gorilla", Category.Primates));
        animalList.Add(new Animal("Green Tree Frog", Category.Amphibians));
        animalList.Add(new Animal("Bald Uakari", Category.Primates));
        animalList.Add(new Animal("Polar Bear", Category.Bears));
        animalList.Add(new Animal("Black Widow Spider", Category.Spiders));
        animalList.Add(new Animal("Bat-Eared Fox", Category.Canines));
        animalList.Add(new Animal("Cheetah", Category.BigCats));
        animalList.Add(new Animal("Cheetah", Category.Spiders));
    }
}

请在这方面提供帮助..

Hi i was looking to align my group headers horizontally.I had succeeded to do so but now the problem is that if i scroll horizontally my group headers are also scrolling.How to fix this.I want my group headers to be fixed and only my content to scroll

My code is given below.

Xaml

<Window.Resources>
    <local:Animals x:Key="animals"/>       

    <CollectionViewSource x:Key="cvs" Source="{Binding Source={StaticResource animals}, Path=AnimalList}">
        <CollectionViewSource.SortDescriptions>
            <scm:SortDescription PropertyName="Category" />
            <scm:SortDescription PropertyName="Name" />
        </CollectionViewSource.SortDescriptions>
        <CollectionViewSource.GroupDescriptions>
            <PropertyGroupDescription PropertyName="Category"/>
        </CollectionViewSource.GroupDescriptions>
    </CollectionViewSource>

    <DataTemplate x:Key="animalTemplate">
        <TextBlock Text="{Binding Path=Name}" Foreground="MediumSeaGreen"/>
    </DataTemplate>
    <Style TargetType="{x:Type HeaderedContentControl}">
        <Setter Property="Control.Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type HeaderedContentControl}">
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="*"/>
                            <RowDefinition Height="Auto"/>
                        </Grid.RowDefinitions>
                        <StackPanel Orientation="Horizontal">
                            <ContentPresenter
                            Content="{TemplateBinding HeaderedContentControl.Header}"
                            ContentTemplate="{TemplateBinding HeaderedContentControl.HeaderTemplate}"
                            ContentSource="Header" VerticalAlignment="Center">
                            </ContentPresenter>
                            <ContentPresenter                             
                            Content="{TemplateBinding ContentControl.Content}"
                            ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}" />
                        </StackPanel>

                        <Separator HorizontalAlignment="Stretch" Grid.Row="1" Margin="-1"/>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>

<Border Margin="30" BorderBrush="Blue" BorderThickness="2" Padding="10">
    <Controls:DataGrid ItemsSource="{Binding Source={StaticResource cvs}}" 
       ItemTemplate="{StaticResource animalTemplate}" Name="ic" Width="200" >

        <Controls:DataGrid.GroupStyle>
            <GroupStyle>
                <GroupStyle.ContainerStyle>
                    <Style TargetType="{x:Type GroupItem}">
                        <Setter Property="Margin" Value="0,0,0,5"/>
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="{x:Type GroupItem}">
                                    <HeaderedContentControl BorderBrush="#FFA4B97F" BorderThickness="0,0,0,1" Margin="0,0,0,5" >
                                        <HeaderedContentControl.Header>
                                            <TextBlock FontSize="12" FontWeight="Bold" Width="100"
                                                                Text="{Binding Name}" Margin="5,0,0,0"/>
                                        </HeaderedContentControl.Header>
                                        <HeaderedContentControl.Content>
                                            <ItemsPresenter/>
                                        </HeaderedContentControl.Content>
                                    </HeaderedContentControl>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </GroupStyle.ContainerStyle>
            </GroupStyle>
        </Controls:DataGrid.GroupStyle>
    </Controls:DataGrid>
</Border>

Code

  public class Animal
{
    private string name;

    public string Name
    {
        get { return name; }
        set { name = value; }
    }

    private Category category;

    public Category Category
    {
        get { return category; }
        set { category = value; }
    }

    public Animal(string name, Category category)
    {
        this.name = name;
        this.category = category;
    }
}

public enum Category
{
    Amphibians,
    Bears,
    BigCats,
    Canines,
    Primates,
    Spiders,
}

public class Animals
{
    private List<Animal> animalList;

    public IEnumerable<Animal> AnimalList
    {
        get { return animalList; }
    }

    public Animals()
    {
        animalList = new List<Animal>();
        animalList.Add(new Animal("California Newt", Category.Amphibians));
        animalList.Add(new Animal("Giant Panda", Category.Bears));
        animalList.Add(new Animal("Coyote", Category.Canines));
        animalList.Add(new Animal("Golden Silk Spider", Category.Spiders));
        animalList.Add(new Animal("Mandrill", Category.Primates));
        animalList.Add(new Animal("Black Bear", Category.Bears));
        animalList.Add(new Animal("Jaguar", Category.BigCats));
        animalList.Add(new Animal("Bornean Gibbon", Category.Primates));
        animalList.Add(new Animal("African Wildcat", Category.BigCats));
        animalList.Add(new Animal("Arctic Fox", Category.Canines));
        animalList.Add(new Animal("Tomato Frog", Category.Amphibians));
        animalList.Add(new Animal("Grizzly Bear", Category.Bears));
        animalList.Add(new Animal("Dingo", Category.Canines));
        animalList.Add(new Animal("Gorilla", Category.Primates));
        animalList.Add(new Animal("Green Tree Frog", Category.Amphibians));
        animalList.Add(new Animal("Bald Uakari", Category.Primates));
        animalList.Add(new Animal("Polar Bear", Category.Bears));
        animalList.Add(new Animal("Black Widow Spider", Category.Spiders));
        animalList.Add(new Animal("Bat-Eared Fox", Category.Canines));
        animalList.Add(new Animal("Cheetah", Category.BigCats));
        animalList.Add(new Animal("Cheetah", Category.Spiders));
    }
}

Please help in this regard..

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

野心澎湃 2024-10-18 03:45:22

我已经提出了一个正是我正在寻找的解决方案。虽然 Zamboni 的解决方案暂时帮助我解决了我的问题,但我仍在寻找更好的解决方案。讨论这里,但我正在为任何感兴趣的人分享代码。

<Window.Resources>
    <local:Animals x:Key="animals"/>

    <CollectionViewSource x:Key="cvs" Source="{Binding AnimalList, Source={StaticResource animals}}">
      <CollectionViewSource.SortDescriptions>
        <scm:SortDescription PropertyName="Category" />
        <scm:SortDescription PropertyName="Name" />
      </CollectionViewSource.SortDescriptions>
      <CollectionViewSource.GroupDescriptions>
        <PropertyGroupDescription PropertyName="Category"/>
      </CollectionViewSource.GroupDescriptions>
    </CollectionViewSource>

    <DataTemplate x:Key="animalTemplate">
      <TextBlock Text="{Binding Name}" Foreground="MediumSeaGreen"/>
    </DataTemplate>

  </Window.Resources>
  <Grid>
    <Controls:DataGrid ItemsSource="{Binding Source={StaticResource cvs}}"             
    ItemTemplate="{StaticResource animalTemplate}" x:Name="ic">
      <Controls:DataGrid.GroupStyle>
        <GroupStyle>
          <GroupStyle.ContainerStyle>
            <Style TargetType="{x:Type GroupItem}">
              <Setter Property="Margin" Value="0,0,0,5"/>
              <Setter Property="Template">
                <Setter.Value>
                  <ControlTemplate TargetType="{x:Type GroupItem}">
                    <Grid>
                      <Grid.RowDefinitions>
                        <RowDefinition Height="*"/>
                        <RowDefinition Height="Auto"/>
                      </Grid.RowDefinitions>
                      <local:DynamicCanvas HorizontalAlignment="Stretch" Height="{Binding ElementName=items, Path=ActualHeight}" x:Name="myCanvas">
                        <ItemsPresenter x:Name="items" Canvas.Left="{Binding ElementName=frezenBorder, Path=ActualWidth}"/>
                        <Grid Background="White" Height="{Binding ElementName=items, Path=ActualHeight}" VerticalAlignment="Stretch" x:Name="frezenBorder"
                           Canvas.Left="{Binding HorizontalOffset, Mode=OneWay, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ScrollViewer}}}">
                          <TextBlock VerticalAlignment="Stretch" MinWidth="100" FontSize="12" FontWeight="Bold" Width="100"
                                Text="{Binding Name}" Margin="5,0,0,0"/>
                        </Grid>
                      </local:DynamicCanvas>
                      <Separator HorizontalAlignment="Stretch" Grid.Row="1" Margin="-1"/>
                    </Grid>
                  </ControlTemplate>
                </Setter.Value>
              </Setter>
            </Style>
          </GroupStyle.ContainerStyle>
        </GroupStyle>
      </Controls:DataGrid.GroupStyle>
    </Controls:DataGrid>
  </Grid>

I have come up with a solution for exactly what i was looking for.Although Zamboni's solution helped me temperorly for solving my problem,i was on the lookout for a better solution. It is discussed here but i am sharing the code for anyone interested.

<Window.Resources>
    <local:Animals x:Key="animals"/>

    <CollectionViewSource x:Key="cvs" Source="{Binding AnimalList, Source={StaticResource animals}}">
      <CollectionViewSource.SortDescriptions>
        <scm:SortDescription PropertyName="Category" />
        <scm:SortDescription PropertyName="Name" />
      </CollectionViewSource.SortDescriptions>
      <CollectionViewSource.GroupDescriptions>
        <PropertyGroupDescription PropertyName="Category"/>
      </CollectionViewSource.GroupDescriptions>
    </CollectionViewSource>

    <DataTemplate x:Key="animalTemplate">
      <TextBlock Text="{Binding Name}" Foreground="MediumSeaGreen"/>
    </DataTemplate>

  </Window.Resources>
  <Grid>
    <Controls:DataGrid ItemsSource="{Binding Source={StaticResource cvs}}"             
    ItemTemplate="{StaticResource animalTemplate}" x:Name="ic">
      <Controls:DataGrid.GroupStyle>
        <GroupStyle>
          <GroupStyle.ContainerStyle>
            <Style TargetType="{x:Type GroupItem}">
              <Setter Property="Margin" Value="0,0,0,5"/>
              <Setter Property="Template">
                <Setter.Value>
                  <ControlTemplate TargetType="{x:Type GroupItem}">
                    <Grid>
                      <Grid.RowDefinitions>
                        <RowDefinition Height="*"/>
                        <RowDefinition Height="Auto"/>
                      </Grid.RowDefinitions>
                      <local:DynamicCanvas HorizontalAlignment="Stretch" Height="{Binding ElementName=items, Path=ActualHeight}" x:Name="myCanvas">
                        <ItemsPresenter x:Name="items" Canvas.Left="{Binding ElementName=frezenBorder, Path=ActualWidth}"/>
                        <Grid Background="White" Height="{Binding ElementName=items, Path=ActualHeight}" VerticalAlignment="Stretch" x:Name="frezenBorder"
                           Canvas.Left="{Binding HorizontalOffset, Mode=OneWay, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ScrollViewer}}}">
                          <TextBlock VerticalAlignment="Stretch" MinWidth="100" FontSize="12" FontWeight="Bold" Width="100"
                                Text="{Binding Name}" Margin="5,0,0,0"/>
                        </Grid>
                      </local:DynamicCanvas>
                      <Separator HorizontalAlignment="Stretch" Grid.Row="1" Margin="-1"/>
                    </Grid>
                  </ControlTemplate>
                </Setter.Value>
              </Setter>
            </Style>
          </GroupStyle.ContainerStyle>
        </GroupStyle>
      </Controls:DataGrid.GroupStyle>
    </Controls:DataGrid>
  </Grid>
棒棒糖 2024-10-18 03:45:22

在 DataGrid 周围放置一个 ScrollViewer。
我还从 DataGrid 中删除了宽度。

<Border Margin="30" BorderBrush="Blue" BorderThickness="2" Padding="10">
 <ScrollViewer HorizontalScrollBarVisibility="Auto" 
               VerticalScrollBarVisibility="Auto">
     <DataGrid ItemsSource="{Binding Source={StaticResource cvs}}"         
               ItemTemplate="{StaticResource animalTemplate}" 
               Name="ic" >
     </DataGrid>
   </ScrollViewer>
</Border>

Put a ScrollViewer around your DataGrid.
I also removed the Width from the DataGrid.

<Border Margin="30" BorderBrush="Blue" BorderThickness="2" Padding="10">
 <ScrollViewer HorizontalScrollBarVisibility="Auto" 
               VerticalScrollBarVisibility="Auto">
     <DataGrid ItemsSource="{Binding Source={StaticResource cvs}}"         
               ItemTemplate="{StaticResource animalTemplate}" 
               Name="ic" >
     </DataGrid>
   </ScrollViewer>
</Border>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文