3

2つのDataGridがあります。それらをきれいにするために、私はそれらにいくつかのスタイリングをしました。CellTemplateとHeaderTemplateを定義し、それらを暗黙的なスタイルでDataGridに適用しました。XAMLに列を追加し、そのままにしておきます。また、HeaderTemplatesもあります。

編集: 私は他のいくつかのシナリオを試したので、ここで何が起こるかについてもう少し説明します:

DataGrid'A'は正常に機能します。XAMLから完全に開始されます。あらゆる種類の幅(星のサイズを含む)を受け入れ、正しく表示されます。これは、VMを持つUserControl内に配置されます。XAMLは次のとおりです。

<DataGrid ItemsSource="{Binding Items}">
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Name}" Header="Name" MinWidth="50" Width="250" HeaderTemplate="{StaticResource DefaultDataGridHeader}"/>
        <DataGridTextColumn Binding="{Binding StartDate}" Header="Start"  MinWidth="50" Width="150" HeaderTemplate="{StaticResource DefaultDataGridHeader}" />
        <DataGridTextColumn Binding="{Binding FinishDate}" Header="Finish"  MinWidth="50" Width="150" HeaderTemplate="{StaticResource DefaultDataGridHeader}" />
        <DataGridTextColumn Binding="{Binding Leader}" Header="Leader"  MinWidth="50" Width="*" HeaderTemplate="{StaticResource DefaultDataGridHeader}" />
    </DataGrid.Columns>
</DataGrid>

次に、DataGridB..があります。

今はもう少し複雑です。DataGridBを表示して他のことを行うコントロールがあります。他の多くのビューで、さまざまなデータとともに使用されます。したがって、すべてのデータに対して、DataGrid列を含む別のビューがあります。データがメインコントロールに到着すると、DataGrid Bの列をクリアし、対応するビューで定義された列を再入力します。

usercontrolのDataGridBは次のとおりです。

<DataGrid x:Name="datagrid" ItemsSource="{Binding Items}" IsReadOnly="True"  SelectionMode="Single" />

UserControlにはObservableCollectionDependencyPropがありGridColumnsます。これは、実際のDataGridColumnsが到着する場所です。したがって、CollectionChangedイベントでこれを行います。

void GridColumnsCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
    datagrid.Columns.Clear();
    foreach (var gridColumn in GridColumns)
    {
        datagrid.Columns.Add(gridColumn);
    }
}

データ固有のビューで実際の列を設定する方法の例を次に示します。

<c:GenericList >
    <c:GenericList.GridColumns>
            <DataGridTextColumn Binding="{Binding Name}" Header="Name" 
            Width="300" HeaderTemplate="{StaticResource DefaultDataGridHeader}"/>
    </c:GenericList.GridColumns>
</c:GenericList>

-------- DataGrid Bで何が起こるか:--------

  • XAMLをこのままにしておくと、列は300ピクセル幅でレンダリングされます。
  • 幅を星のサイズに変更したり、星のサイズの他の列を追加したりすると、20pxの幅でレンダリングされます。(ヘッダーにテキストが含まれている場合でも)
  • MinWidthを設定すると、すべてのスターサイズの列がMinWidthでレンダリングされます。

  • '別のビューから列を配置する'部分全体を省略し、いくつかの列をデータグリッドに直接追加すると、ピクセルサイズの列はヘッダーテキストの幅に広がり、スターサイズの列は20pxの幅でレンダリングされます。また、実行中のアプリでスター付きの列のサイズを変更すると、幅の制約が発生し、列を再び小さくすることができなくなります。-しかし、このバージョンでは、列にバインドするデータはありません。それがこの影響を引き起こしている可能性がありますか?

//編集の終わり。

スタイルは、「コピーの編集」機能を使用してブレンドで作成されました。

彼らはこのようなものです:

<Style x:Key="DefaultDataGridColumnHeaderStyle" TargetType="{x:Type DataGridColumnHeader}">
    <Setter Property="VerticalContentAlignment" Value="Center"/>
    <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type DataGridColumnHeader}">
                <Grid >
                    <Microsoft_Windows_Themes:DataGridHeaderBorder BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" 
                                                                   IsClickable="{TemplateBinding CanUserSort}" IsPressed="{TemplateBinding IsPressed}" IsHovered="{TemplateBinding IsMouseOver}" 
                                                                   Padding="{TemplateBinding Padding}" SortDirection="{TemplateBinding SortDirection}" SeparatorBrush="{TemplateBinding SeparatorBrush}" 
                                                                   SeparatorVisibility="{TemplateBinding SeparatorVisibility}" Background="#00000000">
                        <Grid>
                            <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
                                              VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                            <Rectangle StrokeThickness="0" RadiusY="0" Opacity="0">
                                <Rectangle.Fill>
                                    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                                        <GradientStop Color="#33000000" Offset="1"/>
                                        <GradientStop Color="#4CFFFFFF"/>
                                        <GradientStop Color="#007B7B7B" Offset="0.35"/>
                                    </LinearGradientBrush>
                                </Rectangle.Fill>
                            </Rectangle>
                        </Grid>
                    </Microsoft_Windows_Themes:DataGridHeaderBorder>
                    <Thumb x:Name="PART_LeftHeaderGripper" HorizontalAlignment="Left" Style="{StaticResource ColumnHeaderGripperStyle}" Width="8"/>
                    <Thumb x:Name="PART_RightHeaderGripper" HorizontalAlignment="Right" Style="{StaticResource ColumnHeaderGripperStyle}" Width="8"/>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

<DataTemplate x:Key="DefaultDataGridHeader">
    <Border BorderBrush="{DynamicResource ShadowBrush}" Background="{x:Null}" d:DesignWidth="289" d:DesignHeight="72.28">
        <Grid>
            <Rectangle RadiusY="0" StrokeThickness="0" Fill="{DynamicResource ActionTileBrush}" />
            <Rectangle RadiusY="0" StrokeThickness="0" >
                <Rectangle.Fill>
                    <SolidColorBrush Color="#88FFFFFF" />
                </Rectangle.Fill>
            </Rectangle>
            <TextBlock Text="{Binding}" Margin="12" FontSize="16" FontWeight="Bold">
                <TextBlock.Foreground>
                    <SolidColorBrush Color="#FF11789D" />
                </TextBlock.Foreground>
            </TextBlock>
            <Rectangle RadiusY="0" StrokeThickness="1" Stroke="{DynamicResource ShadowBrush}"></Rectangle>
        </Grid>
    </Border>
</DataTemplate>


<Style x:Key="DefaultDataGridCellStyle" TargetType="{x:Type DataGridCell}">
    <Setter Property="Background" Value="Transparent"/>
    <Setter Property="BorderBrush" Value="Transparent"/>
    <Setter Property="BorderThickness" Value="1"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type DataGridCell}">
                <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True" Padding="12,8">
                    <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <Trigger Property="IsSelected" Value="True">
            <Setter Property="Background" Value="{DynamicResource HighlightBrush}"/>
        </Trigger>
        <Trigger Property="IsKeyboardFocusWithin" Value="True">
            <Setter Property="BorderBrush" Value="{DynamicResource HighlightBrush}"/>
        </Trigger>
    </Style.Triggers>
</Style>



<Style x:Key="DefaultDataGridStyle" TargetType="{x:Type DataGrid}">
    <Setter Property="AlternatingRowBackground" Value="{x:Null}"/>
    <Setter Property="AlternationCount" Value="2"/>
    <Setter Property="AutoGenerateColumns" Value="False"/>
    <Setter Property="Background" Value="{x:Null}"/>
    <Setter Property="BorderBrush" Value="{DynamicResource ChromeBrush}"/>
    <Setter Property="BorderThickness" Value="1"/>
    <Setter Property="CellStyle" Value="{StaticResource DefaultDataGridCellStyle}"/>
    <Setter Property="ColumnHeaderStyle" Value="{StaticResource DefaultDataGridColumnHeaderStyle}"/>
    <Setter Property="Foreground" Value="{DynamicResource ForegroundBrush}"/>
    <Setter Property="HorizontalGridLinesBrush" Value="{DynamicResource ShadowBrush}"/>
    <Setter Property="RowBackground" Value="{DynamicResource BackgroundBrush}"/>
    <Setter Property="RowDetailsVisibilityMode" Value="VisibleWhenSelected"/>
    <Setter Property="ScrollViewer.CanContentScroll" Value="true"/>
    <Setter Property="ScrollViewer.PanningMode" Value="Both"/>
    <Setter Property="Stylus.IsFlicksEnabled" Value="True"/>
    <Setter Property="VerticalGridLinesBrush" Value="{DynamicResource ShadowBrush}"/>
    <Setter Property="VerticalContentAlignment" Value="Stretch"/>
    <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
    <Style.Triggers>
        <Trigger Property="IsGrouping" Value="true">
            <Setter Property="ScrollViewer.CanContentScroll" Value="false"/>
        </Trigger>
    </Style.Triggers>
</Style>

明らかにどこかに問題があり、列をスターサイズに設定できるはずです。または、ピクセルサイズに設定した場合は、それを維持できると期待しています。

助けてくれてありがとう!

4

2 に答える 2

0

2 番目のデータグリッドをホストする UserControl の Horizo​​ntalAlignment は Stretch に設定されていますか? UserControl の Horizo​​ntalAlignment を Stretch に設定してみます - おそらく DataGrid のサイズを制限しています。

于 2013-09-30T15:38:14.663 に答える
0

xaml の 2 番目の DataGridTextColumn との間にスペースがあることを願っていますBindingWidth

于 2012-06-01T12:40:22.527 に答える