- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有几个数字列,希望它们右对齐。这是一个有点人为的例子来说明我的问题:
<Window x:Class="MyApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:Controls="clr-namespace:System.Windows.Controls;assembly=PresentationFramework" xmlns:Windows="clr-namespace:System.Windows;assembly=PresentationFramework" xmlns:Data="clr-namespace:System.Windows.Data;assembly=PresentationFramework" Title="MyApp"
Width="Auto" Height="Auto" SizeToContent="WidthAndHeight" Loaded="Window_Loaded">
<Controls:DataGrid Name="MyDataGrid" IsReadOnly="True"
xmlns="http://schemas.microsoft.com/wpf/2008/toolkit" ItemsSource="{Data:Binding}" AutoGenerateColumns="True">
<Controls:DataGrid.Columns>
<!-- This is a product name and is left justified by default -->
<Controls:DataGridTextColumn Header="ProductName" Binding="{Data:Binding Path=ProductName}" />
<!-- The rest of the columns are numeric and I would like for them to be right justified -->
<Controls:DataGridTextColumn Header="ProductId1" Binding="{Data:Binding Path=ProductId1}" >
<Controls:DataGridTextColumn.ElementStyle>
<Windows:Style TargetType="Controls:TextBlock">
<Windows:Setter Property="HorizontalAlignment" Value="Right"/>
</Windows:Style>
</Controls:DataGridTextColumn.ElementStyle>
</Controls:DataGridTextColumn>
<Controls:DataGridTextColumn Header="ProductId2" Binding="{Data:Binding Path=ProductId2}" >
<Controls:DataGridTextColumn.ElementStyle>
<Windows:Style TargetType="Controls:TextBlock">
<Windows:Setter Property="HorizontalAlignment" Value="Right"/>
</Windows:Style>
</Controls:DataGridTextColumn.ElementStyle>
</Controls:DataGridTextColumn>
<Controls:DataGridTextColumn Header="ProductId3" Binding="{Data:Binding Path=ProductId3}" >
<Controls:DataGridTextColumn.ElementStyle>
<Windows:Style TargetType="Controls:TextBlock">
<Windows:Setter Property="HorizontalAlignment" Value="Right"/>
</Windows:Style>
</Controls:DataGridTextColumn.ElementStyle>
</Controls:DataGridTextColumn>
<!-- More numeric columns follow... -->
</Controls:DataGrid.Columns>
</Controls:DataGrid>
</Window>
除了第一列之外的所有列都重复了正确的对齐方式,看起来是多余的。如果我可以将此网格中的 DataGridTextColumns 设置为右对齐,那么我只需要明确地左对齐第一列。我该怎么做,也许使用样式作为资源?有没有更好的办法?
最佳答案
DataGridTextColumn 不是从 FrameworkElement 派生的,因此您不能为其创建开箱即用的样式。
完成您想要的操作的最简单方法是为 DataGridCell 创建样式并从那里右对齐 TextBlock。然后为不应包含此内容的列设置 CellStyle={x:Null}(或您可能想要的任何其他样式)
<Controls:DataGrid ...>
<Controls:DataGrid.Resources>
<Windows.Style TargetType="Controls:DataGridCell">
<Windows.Setter Property="TextBlock.HorizontalAlignment" Value="Right"/>
</Windows.Style>
</Controls:DataGrid.Resources>
<Controls:DataGrid.Columns>
<!-- This is a product name and is left justified by default -->
<Controls:DataGridTextColumn Header="ProductName"
Binding="{Binding Path=ProductName}"
CellStyle="{x:Null}"/>
更新
但是,如果您确实想将 Style 应用于 DataGridTextColumn,则需要这样的东西。
首先我们需要一个可以“持有风格”的帮助类。在其中,我们添加了我们希望能够设置样式的所有属性(不在 FrameworkElement 中)。在本例中为 ElementStyle。
public class DataGridTextColumnStyleHelper : FrameworkElement
{
public DataGridTextColumnStyleHelper(){}
public static readonly DependencyProperty ElementStyleProperty =
DependencyProperty.Register(
"ElementStyle",
typeof(Style),
typeof(DataGridTextColumnStyleHelper));
public Style ElementStyle
{
get { return (Style)GetValue(ElementStyleProperty); }
set { SetValue(ElementStyleProperty, value); }
}
}
然后我们在xaml中添加样式
<Style x:Key="DataGridTextColumnStyle"
TargetType="local:DataGridTextColumnStyleHelper">
<Setter Property="ElementStyle">
<Setter.Value>
<Style TargetType="TextBlock">
<Setter Property="HorizontalAlignment" Value="Right"/>
</Style>
</Setter.Value>
</Setter>
</Style>
为了能够在 DataGridTextColumn 上应用此样式,我们需要另一个具有 TextColumnStyle 属性的 Helper 类。在其中,我们使用反射和 SetValue 应用样式。
public class MyDataGridHelper : DependencyObject
{
private static readonly DependencyProperty TextColumnStyleProperty = DependencyProperty.RegisterAttached(
"TextColumnStyle",
typeof(Style),
typeof(MyDataGridHelper),
new PropertyMetadata(MyPropertyChangedCallback));
public static void SetTextColumnStyle(DependencyObject element, string value)
{
element.SetValue(TextColumnStyleProperty, value);
}
public static Style GetTextColumnStyle(DependencyObject element)
{
return (Style)element.GetValue(TextColumnStyleProperty);
}
private static void MyPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (DesignerProperties.GetIsInDesignMode(d) == true)
{
return;
}
DataGridTextColumn textColumn = (DataGridTextColumn)d;
Style textColumnStyle = e.NewValue as Style;
foreach (SetterBase setterBase in textColumnStyle.Setters)
{
if (setterBase is Setter)
{
Setter setter = setterBase as Setter;
if (setter.Value is BindingBase)
{
//Not done yet..
}
else
{
Type type = textColumn.GetType();
PropertyInfo propertyInfo = type.GetProperty(setter.Property.Name);
propertyInfo.SetValue(textColumn, setter.Value, null);
}
}
}
}
}
最后,我们可以像这样在 DataGridTextColumn 上使用样式
<DataGridTextColumn Header="ProductId1" Binding="{Binding Path=ProductId1}"
local:MyDataGridHelper.TextColumnStyle="{StaticResource DataGridTextColumnStyle}">
关于c# - 将默认资源样式应用于所有 DataGridTextColumns,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4249082/
我正在尝试提供一个行为类似于 DataGridTextColumn 的 DataGrid 列,但在编辑模式下有一个附加按钮。我查看了 DataGridTemplateColumn,但似乎更容易将 Da
这可能(希望)有一个微不足道或非常简单的答案。 假设我想要为我的 DataGrid 自定义标题.我可以使用 DataTemplate像这样:
有没有办法将工具提示添加到 DataGridColumn 标题并仍然保留排序功能。下面的代码不起作用(它不显示工具提示) 当我使用下面的代码时
我有几个数字列,希望它们右对齐。这是一个有点人为的例子来说明我的问题:
我有一个 DataGridTextColumn ElementStyle,如下所示:
也许,我想,事情太简单了。我有一个数据网格,从后面的代码动态添加列。这行得通。然后我有带有整数值的列,我希望在列中看到右对齐,但它失败了。我的代码是: public List> Integer
我有一个包含 3 个 DataGridTextColumns 的 DataGrid。我希望第一个占 40%,另外两个占 30%,基本上我需要它们填满整个 DataGrid。
我已经搜索并尝试了许多方法来格式化出生日期列,不仅按月份和日期,还考虑到年份。 我不敢相信这这么难做到。 我创建了几个类型转换器,它们将字符串“MM/dd/yyyy”转换为日期时间,尝试转换为不带“/
我有这个 WPF DataGrid:
首先,我使用 WPF 和 DataGrid,因为我想要列标题。但是,如果有办法做到这一点并且仍然有列标题,我不会接受这个解决方案。 现在,我进行了一些广泛的搜索并尝试了通过谷歌搜索找到的各种解决方案,
为什么这样做...
如何向 DataGridTextColumn 添加边距或填充? 最佳答案 没有示例代码的答案不是很有帮助。用这个:
如果我创建到 IsReadOnly 的绑定(bind)DataGridTextColumn 的属性(property),它没有实现。如果我通过标记设置它,它可以工作。 IsReferenceI
我目前有一个绑定(bind)到 Person 对象的 DataGrid: ... 当用户编辑网格并添加新用
我正在使用 WPFtoolkit DataGrid ,我必须将文本包装在 DataGridTextColumn 中或我必须将 ToolTip 添加到文本列。我已经在网上搜索过,但找不到合适的解决方案。
我尝试使用以下代码为 DataGridTextColumn 创建样式 ... 但是,Visual Studio 2010 用蓝线突出显示 {x:Type DataGridTe
我正在使用 DataTrigger 将空单元格替换为“-”文本。我的代码:
我正在尝试以编程方式添加 DataGridTextColumn,并设置一些属性以在单元格中显示文本。我不想使用 TemplateColumn,因为它需要双击才能进入编辑模式。我找不到可以设置文本对齐方
我正在使用 DataTrigger 将空单元格替换为“-”文本。我的代码:
我尝试做的是创建一个 Style 以在 Datagrid 中的所有 DataGridTextColumns 上应用 WordWrap,而不是像这样明确设置它。
我是一名优秀的程序员,十分优秀!