WPF DataGrid禁用自动滚动

时间:2019-06-22 16:33:51

标签: c# wpf datagrid

基本上,我有一个应用程序可以帮助我对照片和电影的收藏进行分类/分类。非常简单,我有一个obs,其中列出了特定文件夹中的所有文件。有两列:ObservableValueDataGrid。我将使用箭头浏览此DataGrid,然后按空格键是否要保留文件(第一列为Keep,因此当我按空格键时,该复选框处于选中状态)。因此,无需单击任何内容,它看起来像这样:

enter image description here

但是,当我单击文件名时(当我单击同一行,但Filename列时,它不会滚动,但与文件名列相比要小得多,所以最终我总是单击行的文件名列的一部分),并且它太长了,无法像这样水平滚动:

enter image description here

问题在于,现在我看不到bool列,因此我必须手动向后滚动,以查看是否标记了文件。因此,为解决此问题,我在SO上看到了许多答案,建议编辑Keep的XAML部分。问题是,这是我的XAML文件:

Keep

重要的是,我自己没有定义列,这就是我填充数据网格的方式:

MainWindow

因此,我通过更改代码中的<Controls:MetroWindow x:Class="FileOrganiser.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:Controls="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro" xmlns:local="clr-namespace:FileOrganiser" mc:Ignorable="d" Title="File Organiser" Height="450" Width="800"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="1*" /> <ColumnDefinition Width="1*" /> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="1*" /> <RowDefinition Height="8*" /> <RowDefinition Height="1*" /> </Grid.RowDefinitions> <MediaElement x:Name="Media" Grid.Row="0" Grid.Column="1" Grid.RowSpan="2" Margin="5"/> <DataGrid x:Name="FilesList" Grid.Column="0" Grid.Row="1" Grid.RowSpan="2" HorizontalAlignment="Center" SelectionChanged="FilesList_OnSelectionChanged"> </DataGrid> <Button x:Name="ButtonSOrt" Grid.Column="1" Grid.Row="2"></Button> </Grid> </Controls:MetroWindow> 来实现。而且,如果我自己定义列并像这样更改public MainWindow() { InitializeComponent(); while (true) { RootDir = FileUtils.SelectRootFolder(); if (RootDir == string.Empty) MessageBox.Show("Select a root folder!"); else break; } files = Directory.GetFiles(RootDir); var videos = files.Select(file => new Video(Path.GetFileName(file), false)).ToList(); FilesList.ItemsSource = videos; } ,我将有4列而不是2列。那么当我以这种方式实现时,有没有办法防止这种自动滚动?

2 个答案:

答案 0 :(得分:1)

决定再回答一次,因为这应该是首选方法,因为它可以使您更好地控制布局:

将其放入您的XAML:

<DataGrid x:Name="FilesList" HorizontalAlignment="Center" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridCheckBoxColumn Binding="{Binding Keep}" Width="25"/>
        <DataGridTextColumn Binding="{Binding Filename}" Width="*"/>
    </DataGrid.Columns>
</DataGrid>

后面的代码中无需进行任何更改。

答案 1 :(得分:-1)

Datagrid应该具有以下附加属性: https://docs.microsoft.com/de-de/dotnet/api/system.windows.controls.scrollviewer.horizontalscrollbarvisibility?view=netframework-4.8

将此设置为“已禁用”:

public class QuickstartSample {
public static void main(String[] args) throws Exception {
// Instantiates a client
try {
    ImageAnnotatorClient vision = ImageAnnotatorClient.create();

  // The path to the image file to annotate
  String fileName = "Bill.jpg";

  // Reads the image file into memory
  Path path = Paths.get(fileName);
  byte[] data = Files.readAllBytes(path);
  ByteString imgBytes = ByteString.copyFrom(data);

  // Builds the image annotation request
  List<AnnotateImageRequest> requests = new ArrayList<>();
  Image img = Image.newBuilder().setContent(imgBytes).build();
  Feature feat = Feature.newBuilder().setType(Type.LABEL_DETECTION).build();
  AnnotateImageRequest request = AnnotateImageRequest.newBuilder()
      .addFeatures(feat)
      .setImage(img)
      .build();
  requests.add(request);

  // Performs label detection on the image file
  BatchAnnotateImagesResponse response = vision.batchAnnotateImages(requests);
  List<AnnotateImageResponse> responses = response.getResponsesList();

  for (AnnotateImageResponse res : responses) {
    if (res.hasError()) {
     // System.out.printf("Error: %s\n", res.getError().getMessage());
      return;
    }

   /* for (EntityAnnotation annotation : res.getLabelAnnotationsList()) {
      annotation.getAllFields().forEach((k, v) ->
          System.out.printf("%s : %s\n", k, v.toString()));
    }*/
  }
}
catch(Exception e)
{

}