Предотвратить wpf заголовок списка дважды щелкнуть столбец авторазмера
У меня есть просмотр списка, в котором я шаблонизировал заголовки столбцов, а элементы списка также шаблонизированы. Однако у меня есть разные шаблоны для некоторых строк в виде сетки. Когда пользователь дважды щелкает заголовок столбца представления списка, где вы можете перетащить ширину столбца, заголовок столбца автоматически изменит размер, то есть увеличит его размер. Это вызывает у меня проблему, потому что ширина заголовка моего столбца больше не синхронизируется с шириной столбцов в моих шаблонах строк.
Существует ли быстрый и простой способ предотвратить такое двойное нажатие на заголовок столбца?
2 ответа
Да, настроить обработчик двойного щелчка на ListView
сам. Затем в обработчике используйте такой код:
private void ListView_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
if (TryFindParent<GridViewColumnHeader>(e.OriginalSource as DependencyObject) != null)
e.Handled = true;
}
куда TryFindParent
определяется как:
public static T TryFindParent<T>(DependencyObject current) where T : class
{
DependencyObject parent = VisualTreeHelper.GetParent(current);
if (parent == null) return null;
if (parent is T) return parent as T;
else return TryFindParent<T>(parent);
}
Я нашел рабочее решение после копания в исходном коде GridViewColumnHeader. Мой XAML для ListView со столбцами:
<ListView.View>
<GridView AllowsColumnReorder="False" x:Name="ListGridView">
<GridView.Columns>
<GridViewColumn x:Name="ExpandHeader"
Width="40">
<GridViewColumn.Header>
<GridViewColumnHeader IsHitTestVisible="False" />
</GridViewColumn.Header>
</GridViewColumn>
И вам нужно поместить такой код в событие Loaded вашего View (при создании столбцов):
private void ViewOnLoaded(object sender, RoutedEventArgs e)
{
var fields = typeof(GridViewColumnHeader).GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
var thumbFieldInfo = fields.FirstOrDefault(fi => fi.FieldType == typeof(Thumb));
var methods = typeof(GridViewColumnHeader).GetMethods(BindingFlags.NonPublic | BindingFlags.Instance);
var eventHandlerMethodInfo = methods.FirstOrDefault(mi => mi.Name == "OnGripperDoubleClicked");
if (thumbFieldInfo != null && eventHandlerMethodInfo != null)
{
foreach (var column in ListGridView.Columns)
{
var header = column.Header as GridViewColumnHeader;
if (header != null)
{
var headerGripper = thumbFieldInfo.GetValue(header) as Thumb;
if (headerGripper != null)
{
var handler = Delegate.CreateDelegate(typeof(MouseButtonEventHandler), header, eventHandlerMethodInfo);
headerGripper.RemoveHandler(Control.MouseDoubleClickEvent, handler);
}
}
}
}
}