2016-07-12 3 views
1

Итак, у меня есть сетка данных WPF с примерно 8 ячейками в каждой строке, я включил только одну из них для простоты, но я хотел бы, чтобы пользователь имел право щелкните эту ячейку и скопируйте содержимое в буфер обмена Windows без щелчка левой кнопкой мыши и сначала выберите его. Я пробовал много фрагментов кода, но, похоже, не могу заставить ничего работать. Каждая строка является связанным элементом.Щелкните правой кнопкой мыши и скопируйте контекстное меню на C# WPF datagrid

Большинство вещей, которые я пытался, это событие MouseRightButtonDown. Некоторые из них попытались перейти на XY-позицию, некоторые из них использовали e.OriginalSource как FrameworkElement, но я не могу заставить ничего работать. Не уверен, что из-за его DataGridHyperlinkColumn в отличие от других типов, используемых в примерах?

Я C# n00b! Любая помощь будет принята с благодарностью.

<DataGrid x:Name="eventsDataGrid" AutoGenerateColumns="False" IsReadOnly="true" ItemsSource="{Binding}" HorizontalAlignment="Left" Margin="10,143,0,0" VerticalAlignment="Top" Height="295" CanUserAddRows="False" CanUserReorderColumns="False" CanUserResizeColumns="True" CanUserSortColumns="False" BorderThickness="1" HorizontalScrollBarVisibility="Disabled" FontSize="10" Width="1003" MouseRightButtonDown="eventsDataGrid_MouseRightButtonDown"> 

     <DataGrid.ContextMenu> 
      <ContextMenu> 
       <MenuItem Header="Copy URL" Click="CopyURL"> 
       </MenuItem> 
      </ContextMenu> 
     </DataGrid.ContextMenu> 

     <DataGrid.Columns> 

      <DataGridHyperlinkColumn Width="230" Header="URL" Binding="{Binding URL}" CanUserResize="False"> 
       <DataGridHyperlinkColumn.HeaderStyle> 
        <Style TargetType="{x:Type DataGridColumnHeader}"> 
         <Setter Property="ToolTip" Value="URL of website" /> 
         <Setter Property="HorizontalContentAlignment" Value="Center"/> 
         <Setter Property="VerticalAlignment" Value="Center"/> 
        </Style> 
       </DataGridHyperlinkColumn.HeaderStyle> 

       <DataGridHyperlinkColumn.CellStyle> 
        <Style TargetType="{x:Type DataGridCell}"> 
         <Setter Property="Foreground" Value="Black" /> 
         <Setter Property="HorizontalAlignment" Value="Center"/> 
         <Setter Property="FontSize" Value="12"/> 
        </Style> 
       </DataGridHyperlinkColumn.CellStyle> 
      </DataGridHyperlinkColumn> 

     </DataGrid.Columns> 
    </DataGrid> 
+1

Вы можете присвоить контекстное меню для ячеек вместо 'DataGrid' и использовать' Command 'с' CommandParameter' вместо события 'Click'. Передавая содержимое ячейки как параметр команды, все должно быть доступно для заполнения буфера обмена в коде. – grek40

+0

Спасибо, человек, который звучит точно именно в том, что мне нужно, но я не могу понять, как назначить мое контекстное меню для ячеек, какая часть XAML теперь войдет в ? Я пробовал его внутри DataGridHyperlinkColumn и DataGridHyperlinkColumn.CellStyle, похоже, не так, и я не могу найти никаких веб-примеров. Есть идеи? – jamie

+1

http://stackoverflow.com/questions/5200687/create-contextmenus-for-datagrid -rows Для передачи элемента в качестве параметра команды требуется несколько модификаций – michauzo

ответ

1

В следующем примере показано, как использовать одно контекстное меню в качестве ресурса для нескольких целевых элементов. Обратите внимание, что было бы неплохо создать пользовательскую команду вместо «заимствования» ApplicationCommands.Copy для демонстрации, как я здесь.

<Window x:Class="WpfApplication2.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525" 
     Loaded="Window_Loaded"> 
    <Window.CommandBindings> 
     <CommandBinding Command="ApplicationCommands.Copy" 
         Executed="CopyCommand_Executed" 
         CanExecute="CopyCommand_CanExecute"/> 
    </Window.CommandBindings> 
    <Window.Resources> 
     <ContextMenu x:Key="ctMenu" DataContext="{Binding PlacementTarget,RelativeSource={RelativeSource Self}}"> 
      <MenuItem Header="Copy URL" 
         Command="ApplicationCommands.Copy" 
         CommandTarget="{Binding}" 
         CommandParameter="{Binding Text}"/> 
     </ContextMenu> 
    </Window.Resources> 
    <StackPanel> 
     <TextBlock Text="123" ContextMenu="{StaticResource ctMenu}"/> 
     <TextBlock Text="456" ContextMenu="{StaticResource ctMenu}"/> 
    </StackPanel> 
</Window> 

Команда связывания также нуждается в какой-то код позади (будет отличаться реализации пользовательских команд)

private void CopyCommand_Executed(object sender, ExecutedRoutedEventArgs e) 
{ 
    Clipboard.SetText(e.Parameter as string); 
} 

private void CopyCommand_CanExecute(object sender, CanExecuteRoutedEventArgs e) 
{ 
    if (!string.IsNullOrEmpty(e.Parameter as string)) 
    { 
     e.CanExecute = true; 
     e.Handled = true; 
    } 
} 
+0

Благодарим за отзыв, но этот код, похоже, ведет себя в так же, как мой оригинальный код. Когда я нажимаю правой кнопкой мыши на строке, появляется меню копирования, но отображается серым цветом, и когда я оставляю щелчок по строке (поэтому ее выбрали), затем щелкните ее правой кнопкой мыши, появится меню копирования и содержимое можно скопировать в буфер обмена. Ожидалось? Извиняюсь, если я точно не объяснил свой желаемый результат :-) – jamie

+0

Я добавляю ContextMenu = "{StaticResource ctMenu}" в мой . Это верно? – jamie

+0

Нет, вы должны добавить его в содержимое ячеек/ячеек через стиль или шаблон. См. Комментарий от @michauzo для более подробной информации. – grek40