2

情報を垂直方向に表示するためにすべてを90度回転させたデータグリッドがあります。それは私が思わないこととは関係ありません。基本的にExpanderであるUserControlをDataGridTemplateColumnに追加しようとしています。私が抱えている問題は、エキスパンダー(ユーザーコントロール)を開くときに、その下にあるセルの後ろで開いていることです。基本的に重なるように前面に持ってくる必要があります。ユーザーコントロールがセル内で開かずに展開されないように、キャンバス内に配置しています。セルを同じサイズに保ち、エキスパンダーを開くと、セルが重なり、その下のデータセルをカバーして表示されます。私が間違っていることについて何か考えはありますか?

  <DataGridTemplateColumn Header="Expander" CanUserResize="False" Width="Auto">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate DataType="UserControl">
                                <Grid Width="Auto" Height="Auto" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" SnapsToDevicePixels="True" OverridesDefaultStyle="True">
                                    <Canvas>
                                        <local:DescriptionUserControl DataContext="{Binding Path=DescriptionViewModel}" x:Name="Description" Height="Auto" Width="Auto" Focusable="True" Margin="0,-2">
                                        </local:DescriptionUserControl>
                                    </Canvas>
                                </Grid>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>

                    <DataGridTemplateColumn Header="Worksheet" Width="Auto">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <Button Content="View Worksheet" HorizontalAlignment="Center" VerticalAlignment="Center" Height="26" Width="110" ></Button>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>

                 <DataGridTextColumn Header="Veeps" width="Auto"></DataGridTextColumn>
                </DataGrid.Columns>
4

1 に答える 1

1

ここCanvasで問題があります。親を拡大しようとはしません。そのため、セルは拡大しません。

しかし、それはまだビジュアルツリーの一部であり、より高い他の要素がありますZIndex。エキスパンダーが拡張されたときに修正ZIndexを試みることもできますが、手間がかかりすぎて、見つけて修正するのが難しいバグがあると思います。

私は「カスタムコントロール」ルートをたどります。HeaderdContentControl次の1つの追加プロパティを継承し、持つコントロールを作成しますIsPopupShowing。コンテンツはポップアップに表示され、ビジュアルツリーの外に表示されます。

実際には、テンプレートのみで実現できます(ただし、カスタムコントロールをお勧めします)。このようなもの:

<Style x:Key="PoppingExpander" TargetType="{x:Type HeaderedContentControl}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type HeaderedContentControl}">
                <Grid>
                    <ToggleButton x:Name="HeaderHolder"
                                  Content="{TemplateBinding Header}"
                                  ContentTemplate="{TemplateBinding HeaderTemplate}"
                                  ContentTemplateSelector="{TemplateBinding HeaderTemplateSelector}"
                                  ContentStringFormat="{TemplateBinding HeaderStringFormat}"/>
                    <Popup x:Name="ContentHolder"
                           Placement="Bottom">
                        <Border Background="Aqua"
                                BorderBrush="LightBlue"
                                BorderThickness="1">
                            <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                              VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                              Margin="{TemplateBiding Padding}" />
                        </Border>
                    </Popup>
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger SourceName="HeaderHolder" Property="IsChecked" Value="True">
                        <Setter TargetName="ContentHolder" Property="IsOpen" Value="True"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

IsOpen[ポップアップのプロパティをトグルボタンのプロパティにバインドすることもできますが、そのスコープに非常にこだわっており、追跡が非常に難しいバグを作成するため、構文IsCheckedを使用するのは本当に好きではありません。]以外の方法がElementName好きですElementName

これHeaderedContentControlにより、ポップアップにコンテンツが表示されます。トグルボタンのスタイルを、エキスパンダーで使用されているもののようにする必要があります(ブレンドを使用してエキスパンダーのスタイルを抽出すると、ボタンのスタイルになります)。

の使用法をに変更Expanderし、 (のような)にHeaderedContentControl固有のプロパティのセッターを削除します。これで完了です。ExpanderIsExpanded

PS-Placementポップアップを別の方向に開きたい場合は、ポップアップのプロパティを変更できます。

于 2012-06-08T14:01:19.643 に答える