我在C#WPF应用程序中使用带有GridViewColumn的ListView。
对于某些列,我使用了可见性管理器(this one)。但是当第1列和第3列可见而第2列不可见时,如果光标太右,则调整第1列会使第2列出现。
如果IsVisible为false,是否可以在列上禁用调整大小(和非活动光标)?
我看到了that post,但我无法在GridViewColumnVisibilityManager
上使用它,我的列并不总是固定的。
GridViewColumnVisibilityManager
有趣的部分:
private static void OnIsVisibleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
GridViewColumn gc = d as GridViewColumn;
if (gc == null)
return;
if (GetIsVisible(gc) == false)
{
originalColumnWidths[gc] = gc.Width;
gc.Width = 0;
// Fix Size there
}
else
{
if (gc.Width == 0)
{
gc.Width = originalColumnWidths[gc];
//UnFix
}
}
}
是否可以以编程方式从列中删除抓手?
一个是重新设置GridViewColumnHeader来移除里面的抓手 它的模板
答案 0 :(得分:1)
终于找到了解决方案:
在App.xaml中:
<Style x:Key="disabledColumn" TargetType="GridViewColumnHeader">
<Setter Property="IsEnabled" Value="False"/>
</Style>
在GridViewColumnVisibilityManager.cs中:
public class GridViewColumnVisibilityManager
{
static Dictionary<GridViewColumn, double> originalColumnWidths = new Dictionary<GridViewColumn, double>();
static Dictionary<GridViewColumn, Style> originalColumnHeader = new Dictionary<GridViewColumn, Style>();
public static bool GetIsVisible(DependencyObject obj)
{
return (bool)obj.GetValue(IsVisibleProperty);
}
public static void SetIsVisible(DependencyObject obj, bool value)
{
obj.SetValue(IsVisibleProperty, value);
}
public static readonly DependencyProperty IsVisibleProperty =
DependencyProperty.RegisterAttached("IsVisible", typeof(bool), typeof(GridViewColumnVisibilityManager), new UIPropertyMetadata(true, OnIsVisibleChanged));
private static void OnIsVisibleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
GridViewColumn gc = d as GridViewColumn;
if (gc == null)
return;
if (GetIsVisible(gc) == false)
{
originalColumnWidths[gc] = gc.Width;
gc.Width = 0;
originalColumnHeader[gc] = gc.HeaderContainerStyle;
gc.HeaderContainerStyle = Application.Current.FindResource("disabledColumn") as Style;
}
else
{
if (gc.Width == 0)
{
gc.Width = originalColumnWidths[gc];
gc.HeaderContainerStyle = originalColumnHeader[gc];
}
}
}
}
答案 1 :(得分:1)
对于纯XAML解决方案,您可以执行以下操作:
<Style x:Key="GridHeaderStyle" TargetType="GridViewColumnHeader">
<!-- any other things you want -->
<Setter Property="IsEnabled"
Value="{Binding RelativeSource={RelativeSource Self},
Path=Column.(local:GridViewColumnVisibilityManager.IsVisible)}" />
</Style>
或者这个(哪个更好,取决于您在样式中还拥有其他东西,以及您是否拥有IsVisible
或IsHidden
或更复杂的东西)
<Style x:Key="GridHeaderStyle" TargetType="GridViewColumnHeader">
<!-- any other things you want -->
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Self},
Path=Column.(local:GridViewColumnVisibilityManager.IsVisible)}"
Value="False">
<Setter Property="IsEnabled" Value="False" />
</DataTrigger>
</Style.Triggers>
</Style>
然后设置:
<GridView ColumnHeaderContainerStyle="{StaticResource GridHeaderStyle}" ...>
(或者,您可以执行常规操作,例如将其设置为App.xaml中的默认样式。)