Отображение нового окна рядом с DataCell в DataGrid (WPF) - PullRequest
1 голос
/ 23 февраля 2011

Мне нужен сценарий, когда пользователь щелкает ячейку в DataGrid в WPF, я хочу открыть рядом с ней NumPad (это в основном для сенсорного ввода). NumPad, я понимаю, это отдельное окно.

1) Как узнать, какая ячейка выбрана?
2) как показать NumPad рядом с ячейкой?
3) Как я могу найти координаты ячейки для позиционирования моего NumPad?
4) Как я могу установить значение ячейки на основе записи NumPad?

NumPad - это пользовательский элемент управления WPF в том же приложении. DataGrid - это элемент управления .NET 4. Это обычное приложение для рабочего стола Windows

Ответы [ 2 ]

8 голосов
/ 07 марта 2011

Это не тривиальная задача, и вы должны иметь некоторые знания о WPF, чтобы выполнить это, но вот несколько идей, которые вы можете искать:

  1. DataGridCell.IsSelected свойство сообщает, выбрана ли ячейка.
  2. Я бы использовал Popup, чтобы отобразить NumPad непосредственно рядом с ячейкой.
  3. Если вы используете Popup, вам не нужны координаты, но вы можете указать относительное размещение, используя свойство Popup.Placement.См. Также этот документ MSDN: Поведение размещения всплывающих окон
  4. Можно попробовать использовать привязку из NumPad к пользовательскому элементу управления в DataGridCell.

ИспользованиеDataGrid.CellStyle или свойство DataGridColumn.CellStyle, вы можете указать альтернативный стиль для всех ячеек DataGrid или некоторого определенного столбца.В этом стиле вы можете изменить шаблон и добавить Popup, который открывается, только если выбрана текущая ячейка.Этого легко добиться, связав свойство Popup.IsOpen со свойством DataGridCell.IsSelected.

Это только первоначальная идея.Вам все равно придется взглянуть на предоставленные ссылки MSDN, а также прочитать некоторые другие материалы о WPF.Хотя для изучения этого «пути WPF» (т. Е. Только XAML) может потребоваться некоторое время, на мой взгляд, это гораздо проще, чем использовать большое количество кода для определения текущей выбранной ячейки, расположив элемент управления в правильном месте,передача данных из NumPad в ячейку и т. д. ...

3 голосов
/ 22 июня 2011

Мне очень нравится ответ Геххо. Выполнение, как он предложил, помимо использования столбца Template поверх стилей текстовых столбцов, привело к следующему 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>

Надеюсь, это поможет!

...