网格交替颜色

时间:2014-04-24 14:29:35

标签: c# wpf .net-4.0 grid

我正在尝试显示另一行交替颜色的网格。最好的方法是将模板交替放在一起,以便能够改变整行。

为了确保没有误解我的意思是网格我的意思是网格,而不是数据网格,而不是网格视图,网格就像<Grid></Grid>

现在我发现的唯一可行的解​​决方案是使用我想要的适当数量的行创建一个网格,并在每行中放入另一个网格,其中包含1行和我需要的3列,并通过更改为每行复制粘贴背面的颜色。如您所见,这不是一个非常干净的解决方案。

所以我环顾四周,发现列表框可以有备用计数,在一个简单的触发器上它可以改变一切,这是完美的,直到我注意到高亮不能被禁用。您可以更改高亮笔刷,但它会覆盖备用颜色,因此两者都不能同时使用。在你问之前我确实使用了透明布什并且透明不是真正透明的,它所做的就是它显示了ListBox控件下面的颜色,它是下面画布的米色,而项目本身就消失了。

任何人都知道在网格上应用交替行模板的方法。在RowDefinition上添加一个简单的样式会很容易,但由于你无法真正告诉你在网格中放置元素的类型,我怀疑有什么东西可以做到这么简单。

编辑:  这是我最新的变化。有点“干净” 我为每个颜色主题创建了2个样式控件样式,如

<Style x:Key="PropertyGrid" TargetType="ItemsControl">
        <Setter Property="ItemsPanel">
            <Setter.Value>
                <ItemsPanelTemplate>
                    <Grid Background="White">                           
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="300"/>
                            <ColumnDefinition Width="2"/>
                            <ColumnDefinition Width="*" />
                        </Grid.ColumnDefinitions>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="40"/>
                        </Grid.RowDefinitions>
                    </Grid>
                </ItemsPanelTemplate>
            </Setter.Value>
        </Setter>
    </Style>

    <Style x:Key="AlternatePropertyGrid" TargetType="ItemsControl">
        <Setter Property="ItemsPanel">
            <Setter.Value>
                <ItemsPanelTemplate>
                    <Grid Background="#FFEBEBEB">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="300"/>
                            <ColumnDefinition Width="2"/>
                            <ColumnDefinition Width="*" />
                        </Grid.ColumnDefinitions>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="40"/>
                        </Grid.RowDefinitions>
                    </Grid>
                </ItemsPanelTemplate>
            </Setter.Value>
        </Setter>
    </Style>

然后我使用了堆栈面板并列出了每一行

<StackPanel>
    <ItemsControl Style="{StaticResource PropertyGrid}">
        <Label Content="Identifier" Style="{StaticResource PropertyNameLabel}"/>
        <Label Content="{Binding ElementName=cboActions, Path=SelectedItem.UniqueIdentifier}" Style="{StaticResource PropertyValueLabel}"/>
        <Rectangle Style="{StaticResource PropertyGridSplitter}"/>
    </ItemsControl>
    <ItemsControl Style="{StaticResource AlternatePropertyGrid}">
        <Label Content="Source" Style="{StaticResource AlternatePropertyNameLabel}"/>
        <Label Name="lblSource" Style="{StaticResource AlternatePropertyValueLabel}"/>
        <Rectangle Style="{StaticResource AlternatePropertyGridSplitter}"/>
    </ItemsControl>
    <ItemsControl Style="{StaticResource PropertyGrid}">
        <Label Content="Description" Style="{StaticResource PropertyNameLabel}"/>
        <Label Name="lblActionDescription" Style="{StaticResource PropertyValueLabel}"/>
        <Rectangle Style="{StaticResource PropertyGridSplitter}"/>
    </ItemsControl>
</StackPanel>

每个项目在各自的样式中都有网格列预设,因此样式确定项目控件中每个对象的网格中的位置。

它有效,但我觉得可能有更有效的方法来做到这一点。这里是它现在的样子截图,可能对视觉人更有帮助,让我知道我想在这里实现什么。

enter image description here

3 个答案:

答案 0 :(得分:0)

使用Datagrid,您可以轻松地执行此操作:

<DataGrid  AlternatingRowBackground="Blue"/> 

使用网格,不知道:p

答案 1 :(得分:0)

对于Grid中的列表框,我们使用一些代码行设置备用颜色(代码隐藏)。

    private void SetAlternateColor()
    {
        var blueBrush = new SolidColorBrush(Colors.Blue);
        var redBrush = new SolidColorBrush(Colors.Red);

        for (int i = 0; i < Items.Count; i++)
        {
            ListBoxItem item = TestListBox.ItemContainerGenerator.ContainerFromIndex(i) as ListBoxItem;
            item.Background = i % 2 == 0 ? blueBrush : redBrush;
        }
    }

    private void TestGrid_Loaded(object sender, RoutedEventArgs e)
    {
        SetAlternateColor();
    }

不知道这是不是你想要的。

答案 2 :(得分:-1)

重复代码是最快的解决方案。