设置不可调整大小的GridViewColumn

时间:2016-08-18 08:23:30

标签: c# wpf

我在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来移除里面的抓手   它的模板

2 个答案:

答案 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>

或者这个(哪个更好,取决于您在样式中还拥有其他东西,以及您是否拥有IsVisibleIsHidden或更复杂的东西)

<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中的默认样式。)

相关问题