【问题标题】:How to resize DataGrid column width in WPF如何在 WPF 中调整 DataGrid 列宽
【发布时间】:2019-02-18 08:39:12
【问题描述】:

我有一个直接从数据库获取数据的数据网格视图。问题是标题、列和行的尺寸(高度和宽度)都很大,看起来不太整齐。

这是我完成的当前 XAML 和 .cs 代码。

XAML

<WrapPanel Margin="20,0,20,20" HorizontalAlignment="Center">
    <DataGrid AutoGenerateColumns="True" Name="dataGridProgram" SelectionMode="Single" 
              FontSize="15" BorderThickness="1" IsReadOnly="true" Height="300" 
              Width="700"/>
</WrapPanel>

CS

Program_Controller _PController = new Program_Controller();
OleDbDataAdapter da = _PController.GetProgramList();
DataTable dt = new DataTable();
da.Fill(dt);
dataGridProgram.ItemsSource = dt.AsDataView();

这是我的数据网格视图的当前外观。我从不自定义更改行和列的大小。这都是自动/默认值。我还尝试手动设置数据网格的列/行高度和宽度。但是,我看不到文字。那么我究竟是如何没有得到更简单的数据网格的呢?或者如何为数据网格设置模板?

我希望它像这样显示得更简单、更整洁。我想要它这样我就不需要水平滚动,因为尺寸是正常大小。

【问题讨论】:

  • 为什么你有一个包裹板而不是一个网格?你确定你在那里没有造型吗?因为这在我看来不像是默认样式。
  • @Andy 我的意思是我从不更改标题、列和行大小/边距等的任何内容。谈到默认样式,我可以知道我是否使用了材料设计主题,它是否也会影响样式,即使我不使用&lt;materialDesign:...&gt;标签?
  • 我可以告诉你,你肯定在那里使用了一些样式。如果您合并了所有材料设计的东西,那么您正在使用它。将所有这些资源字典引用从 app.xaml 中取出。使用 nuget 包管理器删除材料设计包。修复任何错误......那么你就没有使用材料设计。
  • @Andy 哦,我明白了。感谢您及时回复。我将材料设计用于一些过渡内容和动画。如果我使用 nugget 包管理器将其删除,是否意味着动画也消失了?
  • 是的。材料设计的东西几乎无所不包。您要么完全“买入”,要么最好不要使用它。我倾向于制作自己的动画。

标签: c# wpf xaml datagrid


【解决方案1】:

这不是默认样式。这是您通过使用材料设计 UI 库获得的。

您可以通过从您的 App.xaml 文件或您包含它的任何位置删除以下资源字典的引用来切换回默认样式:

<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Defaults.xaml" />

我可以做些什么来仅覆盖数据网格视图的材料设计样式?

当然。在App.config&lt;ResourceDictionary.MergedDictionaries&gt; 元素之后的ResourceDictionary 中包含这些样式:

<Style TargetType="{x:Type DataGrid}" BasedOn="{StaticResource {x:Type DataGrid}}" />
<Style TargetType="{x:Type DataGridCell}" BasedOn="{StaticResource {x:Type DataGridCell}}" />
<Style TargetType="{x:Type DataGridColumnHeader}" BasedOn="{StaticResource {x:Type DataGridColumnHeader}}" />
<Style TargetType="{x:Type DataGridRow}" BasedOn="{StaticResource {x:Type DataGridRow}}" />
<Style TargetType="{x:Type DataGridRowHeader}" BasedOn="{StaticResource {x:Type DataGridRowHeader}}" />

【讨论】:

  • 我能做些什么来仅覆盖数据网格视图的材料设计样式吗?
  • 谢谢,这真的很有帮助。我已经接受了这个作为答案:)
【解决方案2】:

在我看来,如果您不了解某些东西的工作原理并且它没有按照您的意愿行事,那么您最好不要使用它。 因此,我建议从您的项目中删除材料设计。

您应该阅读样式。考虑以下是该过程的开始。

让我们想象一下,这是一个比数据网格更简单的控件。 样式有范围,这是材料设计设置的默认样式。 这按类型与 uielement 相关联。 对于默认样式,它使用类型作为键。 wpf 中的样式是一个属性,因此您可以设置它,当您将其设置在较低的范围内时,它会覆盖之前设置的任何内容。

您可以将样式设置为其中没有任何内容或 {x:Null}。 这将超越材料设计风格。 同样,它也可能使用的模板。

但我不建议你这样做。

为什么?

因为 Datagrid 不仅仅是一个控件。

Material Design 将对构成数据网格的众多部分进行模板化和样式化。 DataGridRow、DataGridCell 等。

由于您是初学者,因此您不知道它们是什么,并且可能会错过一些内容,但仍然会得到意想不到的结果。

你最终会得到它的工作。

呼。

然后,您可能会注意到其他控件看起来很奇怪,并且行为与您预期的不同。

如果你想要它给你的一切,Material Design 是很棒的。

如果你不这样做,请不要使用它。

【讨论】:

  • 感谢您的推荐。我会记住这一点。再次感谢。 :)
猜你喜欢
  • 2012-12-25
  • 1970-01-01
  • 2011-08-22
  • 2011-11-20
  • 2011-09-25
  • 2011-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多