在DataGrid(WPF)中的DataCell旁边显示一个新窗口

时间:2011-02-23 19:37:34

标签: wpf wpf-controls wpfdatagrid

我想要一个用户点击WPF中DataGrid中的单元格的场景,我想在它旁边打开NumPad(这基本上是基于触摸的输入)。 NumPad,我理解是一个单独的窗口。

1)如何知道选择了哪个Cell?2)如何在单元格旁边显示NumPad?
3)如何找到单元的坐标来定位我的NumPad?
4)如何根据NumPad条目设置单元格的值?

NumPad是同一应用程序中的WPF用户控件。 DataGrid是一个.NET 4控件。 这是一个普通的Windows桌面应用程序

2 个答案:

答案 0 :(得分:8)

这不是一项微不足道的任务,你应该对WPF有一些了解,但是这里有一些你可能想要的想法:

  1. DataGridCell.IsSelected属性会告诉您是否选择了单元格。
  2. 我会使用Popup直接在单元格旁边显示NumPad。
  3. 如果您使用Popup,则不需要坐标,但可以使用Popup.Placement属性指定相对位置。另请参阅此MSDN文档:Popup Placement Behavior
  4. 您可以尝试使用NumPad中的绑定到DataGridCell中的用户控件。
  5. 使用DataGrid.CellStyleDataGridColumn.CellStyle属性,您可以为DataGrid的所有单元格或某个特定列指定备用样式。在此样式中,您可以更改模板并添加Popup,只有在选中当前单元格时才会打开该{{1}}。您可以通过将Popup.IsOpen属性绑定到DataGridCell.IsSelected属性来轻松实现此目的。

    这只是一个初步想法。您仍然需要查看提供的MSDN链接,并阅读有关WPF的其他一些内容。虽然可能需要一些时间来学习这种“WPF方式”(即只有XAML),但是(在我看来)它比使用大量代码隐藏来确定当前选择的单元格,将控件定位在正确的位置更容易,将数据从NumPad传输到单元格等等......

答案 1 :(得分:3)

我真的很喜欢Gehho的回答。 按照他的建议,除了使用模板列而不是样式文本列之外,还会产生以下XAML:     

    <Grid x:Name="LayoutRoot">
        <DataGrid>
            <DataGrid.Columns>
                <DataGridTextColumn Header="R" Binding="{Binding Color.R}" />
                <DataGridTextColumn Header="G" Binding="{Binding Color.G}" />
                <DataGridTextColumn Header="B" Binding="{Binding Color.B}" />
                <DataGridTextColumn Header="Alpha" Binding="{Binding Color.A}" />
                <DataGridTemplateColumn Header="Thumb">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <Border x:Name="border" Background="{Binding}">
                                <Popup IsOpen="{Binding IsMouseOver, ElementName=border, Mode=OneWay}"
                                         PopupAnimation="Fade"
                                         Placement="MousePoint">
                                    <Border Width="200" Height="200" Background="{Binding Background , ElementName=border, Mode=OneWay}" />
                                </Popup>
                            </Border>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
            <SolidColorBrush Color="Red"/>
            <SolidColorBrush Color="Green"/>
            <SolidColorBrush Color="Blue"/>
            <SolidColorBrush Color="Yellow"/>
            <SolidColorBrush Color="SteelBlue"/>
            <SolidColorBrush Color="Lime"/>
            <SolidColorBrush Color="Cyan"/>             
        </DataGrid>
    </Grid>
</Window>

希望这有帮助!