4

WPF Toolkit DataGridには、次のカスタム列ヘッダースタイルを使用します。

<Style x:Name="ColumnStyle" x:Key="ColumnHeaderStyle" TargetType="my:DataGridColumnHeader">
    <Setter Property="ContentTemplate">
        <Setter.Value>
            <DataTemplate>
                <StackPanel Orientation="Vertical" HorizontalAlignment="Stretch" Background="LightYellow">
                    <TextBlock Text="{Binding Name}" HorizontalAlignment="Stretch" TextAlignment="Left" Background="LightGreen" />
                    <TextBlock Text="{Binding Data}" HorizontalAlignment="Stretch" TextAlignment="Right" Background="LightBlue" />
                </StackPanel>
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>

ヘッダーのDataContextはコードで設定され、NameプロパティとData文字列プロパティは次のようにDataGridの初期幅を使用して正しく表示されます。

---------------
|Name         |
|         Data|
---------------

ただし、列のサイズを変更すると、ヘッダー表示はリフローせず、代わりに同じままになります。

--------------------
|Name              |
|         Data     |
--------------------

予想通り、次のようになります。

--------------------
|Name              |
|              Data|
--------------------

上記の目的の動作を実現するには、何をする必要がありますか?

同様に、ヘッダーの内容も垂直方向に伸びていないようです。

更新: 追加

    <Setter Property="VerticalAlignment">
        <Setter.Value>Bottom</Setter.Value>
    </Setter>

スタイルに合わせて、ヘッダーを下に正しく配置しているようです。残念ながら、Horizo​​ntalAlignmentプロパティを「Stretch」に設定しても、私が探していることはできないようです。

Reproの詳細: 以下は、動作を示すコードスニペットです。

Window1.xaml:

<Window x:Class="GridTest.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300" xmlns:my="http://schemas.microsoft.com/wpf/2008/toolkit">
    <Window.Resources>
        <Style x:Name="ColumnStyle" x:Key="ColumnHeaderStyle" TargetType="my:DataGridColumnHeader">
            <Setter Property="ContentTemplate">
                <Setter.Value>
                    <DataTemplate>
                        <DockPanel>
                            <TextBlock DockPanel.Dock="Left" Text="{Binding Name}" />
                            <TextBlock DockPanel.Dock="Right" Text="{Binding Data}" />
                        </DockPanel>
                    </DataTemplate>
                </Setter.Value>
            </Setter>
        </Style>

        <Style x:Name="RowHeaderStyle" x:Key="RowHeaderStyle" TargetType="my:DataGridRowHeader">
            <Setter Property="Content" Value="{Binding}" />
            <Setter Property="ContentTemplate">
                <Setter.Value>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <TextBlock Text="{Binding Path=Content.Name, RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type my:DataGridRowHeader}}}" 
                                       VerticalAlignment="Center"/>
                            <TextBlock Padding="5">|</TextBlock>
                            <TextBlock Text="{Binding Path=Content.Data, RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type my:DataGridRowHeader}}}"
                                       VerticalAlignment="Center"/>
                        </StackPanel>
                    </DataTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>
    <Grid>
        <my:DataGrid Name="dg" 
                     ColumnHeaderStyle="{StaticResource ColumnHeaderStyle}"
                     RowHeaderStyle="{StaticResource RowHeaderStyle}"
                     HeadersVisibility="All">
        </my:DataGrid>
    </Grid>
</Window>

およびWindow1.xaml.csの分離コード

using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Data;
using Microsoft.Windows.Controls;
using SLModel;

namespace GridTest
{
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();

            this.Loaded += new RoutedEventHandler(Window1_Loaded);
        }

        void Window1_Loaded(object sender, RoutedEventArgs e)
        {
            Inputs = new List<Input>();
            Outputs = new List<Output>();

            Input i1 = new Input() { Name = "I 1", Data = "data 1" };
            Input i2 = new Input() { Name = "I 2", Data = "data 2" };
            Input i3 = new Input() { Name = "I 3", Data = "data 3" };


            Inputs.Add(i1); Inputs.Add(i2);

            Output o1 = new Output() { Name = "O 1", Data = "data 1" };
            Output o2 = new Output() { Name = "O 2", Data = "data 2" };
            Output o3 = new Output() { Name = "O 3", Data = "data 3" };

            Outputs.Add(o1); Outputs.Add(o2); Outputs.Add(o3);

            Relationship r1 = new Relationship() { Formula = "F1" };
            Relationship r2 = new Relationship() { Formula = "F2" };
            Relationship r3 = new Relationship() { Formula = "F3" };
            Relationship r4 = new Relationship() { Formula = "F4" };
            Relationship r5 = new Relationship() { Formula = "F5" };
            Relationship r6 = new Relationship() { Formula = "F6" };


            i1.Relationships.Add(r1);
            i1.Relationships.Add(r2);
            i2.Relationships.Add(r3);
            i2.Relationships.Add(r4);
            i3.Relationships.Add(r5);
            i3.Relationships.Add(r6);

            CreateColumn(o1, 0);
            CreateColumn(o2, 1);
            CreateColumn(o3, 2);

            dg.Items.Add(i1);
            dg.Items.Add(i2);
            dg.Items.Add(i3);
            dg.ColumnWidth = DataGridLength.SizeToHeader;
        }

        private void CreateColumn(Output output, int index)
        {
            Binding textBinding = new Binding();
            textBinding.Path = new PropertyPath(string.Format("Relationships[{0}].Formula", index));
            textBinding.Mode = BindingMode.TwoWay;

            DataGridTextColumn tc = new DataGridTextColumn();
            tc.Binding = textBinding;
            dg.Columns.Add(tc);
            tc.Header = output;
        }

        private List<Output> Outputs { get; set; }
        private List<Input> Inputs { get; set; }
    }
}

単純なクラスInput、Output、Relationshipの場合:

public class Input {public Input(){Relationships = new ObservableCollection(); }

public string Name { get; set; }
public string Data { get; set; }

public ObservableCollection<Relationship> Relationships { get; set; }

}

public class Output {public Output(){}

public string Name { get; set; }
public string Data { get; set; }

}

public class Relationship {public Relationship(){} public string Formula {get; セットする; }}

再現手順:

  1. アプリケーションを起動する

  2. 列ヘッダー「O1data1」、「O 2data 2」、および「O3data3」を確認します

  3. 列区切り文字を右にドラッグして、最初の列を広くします

  4. 'Name' TextBlock(この場合は'O 1')と'Data' TextBlock('data 1')の間の距離が変化していないこと、つまり'Data'TextBlockが右側に'ドッキングされていないことを確認してください'列ヘッダーの端。

4

3 に答える 3

4

StackPanel私はあなたをGrid:に置き換えることをお勧めします

<Style x:Name="ColumnStyle" x:Key="ColumnHeaderStyle" TargetType="my:DataGridColumnHeader">
    <Setter Property="ContentTemplate">
        <Setter.Value>
            <DataTemplate>
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto" />
                        <RowDefinition Height="Auto" />
                    </Grid.RowDefinitions>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto" />
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition Width="Auto" />
                    </Grid.ColumnDefinitions>
                    <TextBlock Grid.Row="0" Grid.Column="0" Text="{Binding Name}" Background="LightGreen" />
                    <TextBlock Grid.Row="1" Grid.Column="2" Text="{Binding Data}" Background="LightBlue" />
                </Grid>
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>

それでも問題が解決しない場合は、のを編集する必要がありControlTemplateますDataGridColumnHeader。デフォルトのテンプレートがどのように表示されるかはわかりませんが、がContentPresenter伸縮可能なコンテナ内にない場合(のようにGrid)、内部にあるものをストレッチしてもかまいContentPresenterません。しかし、私が確信していることの1つは、StackPanels指示してもストレッチしないことです。最初に必ず試してみてGridくださいDataTemplate

更新(修正済み)

ControlTemplateさて、私はのデフォルトを掘り起こしましたDataGridColumnHeader。を使用していることが判明したので、それは問題ではない思いますGrid

キーは:かもしれませんContentPresenter

<ContentPresenter
    SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
    VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
    HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" />

HorizontalContentAlignment="Stretch"あなたはただあなたのDataGridColumnHeaderスタイルを設定する必要があるかもしれません。

于 2010-01-28T01:32:59.967 に答える
3

WPF 4 DataGridを使用しましたが、これと同じ問題があり、DataGridColumnHeaderスタイルでHorizo​​ntalContentAlignmentを設定するだけで解決しました(上記で提案したDanMの功績)...

<Style TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
</Style>
于 2011-04-03T18:06:27.643 に答える
0

代わりにドックパネルを使用してください

<DockPanel Background="LightYellow">
   <TextBlock DockPanel.Dock="Left" Text="{Binding Name}" TextAlignment="Left" Background="LightGreen" />
   <TextBlock DockPanel.Dock="Right" Text="{Binding Data}" HorizontalAlignment="Right" TextAlignment="Right" Background="LightBlue" />
</DockPanel >
于 2010-01-27T02:48:02.257 に答える