gpt4 book ai didi

c# - 代码隐藏中的 WPF DataGrid 样式

转载 作者:行者123 更新时间:2023-11-30 14:34:57 30 4
gpt4 key购买 nike

我的 WPF 应用程序中有一个用于数据网格的 xaml 样式,我现在正在编写一个继承自 DataGrid 的自定义控件,我想在代码隐藏中应用以下样式:

<Style TargetType="DataGrid">

<!-- Make the border and grid lines a little less imposing -->
<Setter Property="BorderBrush" Value="#DDDDDD" />
<Setter Property="HorizontalGridLinesBrush" Value="#DDDDDD" />
<Setter Property="VerticalGridLinesBrush" Value="#DDDDDD" />

<Setter Property="RowStyle">
<Setter.Value>
<Style TargetType="DataGridRow">
<Style.Triggers>
<!-- Highlight a grid row as the mouse passes over -->
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="Lavender" />
</Trigger>
</Style.Triggers>
</Style>
</Setter.Value>
</Setter>
<Setter Property="CellStyle">
<Setter.Value>
<Style TargetType="DataGridCell">
<Style.Triggers>
<!-- Highlight selected rows -->
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="Lavender" />
<Setter Property="BorderBrush" Value="Lavender" />
<Setter Property="Foreground" Value="Black" />
</Trigger>
<!--StartsEditingOnMouseOver-->
<!--<Trigger Property="IsMouseOver" Value="True">
<Setter Property="IsEditing" Value="True" />
</Trigger>-->
</Style.Triggers>

<EventSetter Event="PreviewMouseLeftButtonDown" Handler="DataGridCell_PreviewMouseLeftButtonDown" />
<EventSetter Event="PreviewTextInput" Handler="DataGridCell_PreviewTextInput" />

<!-- Add some padding around the contents of a cell -->
<Setter Property="Padding" Value="4,3,4,3" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="DataGridCell">
<Border Padding="{TemplateBinding Padding}"
Background="{TemplateBinding Background}">
<ContentPresenter />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Setter.Value>
</Setter>
</Style>

到目前为止,我有以下代码:

static DionysusDataGrid()
{

BorderBrushProperty.OverrideMetadata(typeof(DionysusDataGrid), new FrameworkPropertyMetadata(ColorConverter.ConvertFromString("#FFDDDDDD") as Color?));
HorizontalGridLinesBrushProperty.OverrideMetadata(typeof(DionysusDataGrid), new FrameworkPropertyMetadata(ColorConverter.ConvertFromString("#FFDDDDDD") as Color?));
VerticalGridLinesBrushProperty.OverrideMetadata(typeof(DionysusDataGrid), new FrameworkPropertyMetadata(ColorConverter.ConvertFromString("#FFDDDDDD") as Color?));

}

但我不知道如何对本身也有样式的“RowStyle”属性做同样的事情。在设置 BorderBrushProperty 时我也收到以下错误:

Default value type does not match type of property 'BorderBrush'."

谁能帮帮我?

谢谢

更新:

我通过将代码更新为以下内容解决了错误:

    static DionysusDataGrid()
{

BrushConverter converter = new BrushConverter();

BorderBrushProperty.OverrideMetadata(typeof(DionysusDataGrid), new FrameworkPropertyMetadata((System.Windows.Media.Brush)converter.ConvertFromString("#FFDDDDDD")));
HorizontalGridLinesBrushProperty.OverrideMetadata(typeof(DionysusDataGrid), new FrameworkPropertyMetadata((System.Windows.Media.Brush)converter.ConvertFromString("#FFDDDDDD")));
VerticalGridLinesBrushProperty.OverrideMetadata(typeof(DionysusDataGrid), new FrameworkPropertyMetadata((System.Windows.Media.Brush)converter.ConvertFromString("#FFDDDDDD")));

}

最佳答案

要在代码中隐藏样式,适用一些通用规则:

您在 XAML 中键入的任何内容在良好的旧 C# 中都有等效项:

<Style ...>只是System.Windows.Style . Setter也是如此, Trigger ,随你便。

唯一的陷阱来自 ContentProperty attribute 这是分配的默认属性,例如当您这样做时:

<TextBlock>My text here!</TextBlock>

它设置了 TextBlock.Text属性(property)"My text here!" ,因为 TextBlock类标有属性 [ContentProperty("Text")]

最后,当您从 C# 构建时,您需要从最嵌套的元素开始:

<Style TargetType="DataGrid">
<Setter Property="BorderBrush" Value="#DDDDDD" />
</Style>

变成:

var brushConverter = new BrushConverter();

var bbSetter = new Setter(
DataGrid.BorderBrushProperty,
brushConverter.ConvertFromString("#FFDDDDDD"));

var style = new Style(typeof(DataGrid));
style.Setters.Add(bbSetter);

由此您应该能够将任何 XAML 转换为 C#,
不过,值得注意的是,您不能将任何 C# 映射到 XAML,例如,您不能在 XAML 中制作动态 Storyboard,但可以在 C# 中制作。

关于c# - 代码隐藏中的 WPF DataGrid 样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13045707/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com