我有一个数据网格,我将所有内容旋转90度以垂直显示我的信息。这与我不认为的任何事情有关。我正在尝试将一个基本上是Expander的UserControl添加到DataGridTemplateColumn中。我遇到的问题是当我打开我的扩展器(usercontrol)时,它正在它下面的单元格后面打开。我需要把它带到前面,基本上重叠它。我在画布中有它,以便用户控件不会在单元格中打开并展开。我希望单元格保持相同的大小,打开扩展器时,它将重叠并显示覆盖其下方的数据中心。我有什么想法吗?
<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>
答案 0 :(得分:1)
此处Canvas
是一个问题。它从不试图扩大它的父母,这就是细胞不扩张的原因。
但是,它仍然是可视化树的一部分,还有其他元素具有更高的ZIndex
。您可以尝试修复扩展器扩展时的ZIndex
,但我相信这将需要太多的工作,并且会有很难找到并修复的错误。
我沿着“自定义控制”路线前进。构建一个继承自HeaderdContentControl
的控件,并具有一个额外的属性: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
,删除特定于Expander
的属性集(例如IsExpanded
),您就应该完成。
P.S。 - 如果您希望它以另一个方向打开,您可以更改弹出窗口的Placement
属性。