设置不可调整大小的GridViewColumn

4

我在我的C# WPF应用程序中使用ListView和GridViewColumn。

对于某些列,我使用可见性管理器(这个)。但是当列1和3可见而列2不可见时,如果光标太靠右,则调整列1会使列2出现。

如果IsVisible为false,是否可以禁用列的调整大小(并使光标无效)?

我看到了那篇文章,但我无法在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个回答

2

最终找到了一个解决方案:

在 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
对于纯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中将其设置为默认样式。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接