82 / 82 / 32
Регистрация: 17.02.2016
Сообщений: 226
|
|
1
|
.NET 4.x Как получить имя столбца при вызове контекстного меню в ListView?
05.12.2017, 11:21. Показов 1071. Ответов 2
Доброго утра, дня или вечера.
Собственно, сабж в заголовке.
Код:
Кликните здесь для просмотра всего текста
XML | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
| <Window x:Class="ListViewProblemApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Grid>
<ListView Name="DemoListView"
LayoutUpdated="ListView_LayoutUpdated"
ContextMenuOpening="DemoListView_OnContextMenuOpening">
<ListView.ContextMenu >
<ContextMenu Name="PopupFilterContextMenu" Focusable="False"
Background="#4D6082" Padding="0">
<ContextMenu.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Background="#4D6082"/>
</ItemsPanelTemplate>
</ContextMenu.ItemsPanel>
<MenuItem StaysOpenOnClick="True" >
<MenuItem.Header>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition Width="100"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBlock Name="PopupFilterName" Grid.Column="0"
Foreground="PapayaWhip"
VerticalAlignment="Center"/>
<TextBox Name="PopupFilterValue" Margin="5 0" Grid.Column="1" />
<Button Name="PopupFilterConfirmButton" Grid.Column="2" Cursor="Hand">
Фильтровать
</Button>
</Grid>
</MenuItem.Header>
</MenuItem>
</ContextMenu>
</ListView.ContextMenu>
<ListView.View>
<GridView>
<GridView.ColumnHeaderContainerStyle>
<Style>
<Setter Property="TextElement.FontSize" Value="12" />
</Style>
</GridView.ColumnHeaderContainerStyle>
<GridView.Columns>
<GridViewColumn DisplayMemberBinding="{Binding Path=Id}" Width="100" >
<GridViewColumnHeader Name="Id" Content="Код" />
</GridViewColumn>
<GridViewColumn>
<GridViewColumnHeader Name="Name" Content="Имя" />
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=Name}" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView.Columns>
</GridView>
</ListView.View>
</ListView>
</Grid>
</Window> |
|
C# | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
| using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
namespace ListViewProblemApp
{
internal class User
{
public long Id { get; set; }
public string Name { get; set; }
public User(long id, string name)
{
Id = id;
Name = name;
}
}
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DemoListView.ItemsSource = new List<User>
{
new User(0, "a"), new User(1, "b"), new User(2, "c"),
new User(3, "d"), new User(4, "e"), new User(5, "f"),
new User(6, "g"), new User(7, "h"), new User(8, "i")
};
}
private void DemoListView_OnContextMenuOpening(object sender, ContextMenuEventArgs e)
{
// TODO Как тут получить имя столбца ??
}
private void ListView_LayoutUpdated(object sender, EventArgs eventArgs)
{
const double scrollBarSize = 30;
var autoFillColumnIndex = ((GridView)DemoListView.View).Columns.Count - 1;
if (double.IsNaN(DemoListView.ActualWidth))
{
DemoListView.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
}
var remainingSpace = DemoListView.ActualWidth;
for (var i = 0; i < ((GridView)DemoListView.View).Columns.Count; i++)
{
if (i != autoFillColumnIndex)
{
remainingSpace -= ((GridView)DemoListView.View).Columns[i].ActualWidth;
}
}
remainingSpace -= scrollBarSize;
var resultColumnSize = remainingSpace >= 0 ? remainingSpace : 0;
((GridView)DemoListView.View).Columns[autoFillColumnIndex].Width = resultColumnSize;
}
}
} |
|
Добавлено через 1 час 32 минуты
UPD: сам нашёл способ, может кому пригодится.
C# | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
| private void DemoListView_OnContextMenuOpening(object sender, ContextMenuEventArgs contextMenuEventArgs)
{
var namesTuple = GetHeaderGridView(sender as ListView, contextMenuEventArgs.CursorLeft);
MessageBox.Show(namesTuple?.ToString());
}
private static Tuple<string, string> GetHeaderGridView(ListView listView, double cursorLeftOffset)
{
var gridView = listView?.View as GridView;
var columns = gridView?.Columns;
if (columns == null)
{
return null;
}
GridViewColumn activeGridViewColumn = null;
double leftOffset = 0;
foreach (var item in columns)
{
leftOffset += item.ActualWidth;
if (leftOffset > cursorLeftOffset)
{
activeGridViewColumn = item;
break;
}
}
var header = activeGridViewColumn?.Header as GridViewColumnHeader;
if (header == null)
{
return null;
}
var headerName = header.Name;
var headerContent = header.Content.ToString();
return new Tuple<string, string>(headerName, headerContent); ;
} |
|
0
|