【问题标题】:How to use the Click event in a GridViewColumn on a WPF TreeView/ListView?如何在 WPF TreeView/ListView 的 GridViewColumn 中使用 Click 事件?
【发布时间】:2011-04-20 17:34:55
【问题描述】:

目前我有一些GridViewColumns,例如:

<GridViewColumn Width="20">
    <GridViewColumnHeader Content="X" />
    <GridViewColumn.CellTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <Image Width="18"
                Height="18"
                Source="{Binding VisibleIcon}"
                Opacity="{Binding VisibleOpacity}"/>
                <TextBlock Text="{Binding Name}"/>
            </StackPanel>
        </DataTemplate>
    </GridViewColumn.CellTemplate>
</GridViewColumn>

我想在此列上单击的项目上执行某些操作。但我不知道如何添加Click 事件,因为GridViewColumnImage 都没有Click 事件。

我希望是这样的:

void ClickEvent ...
{
    SelectLayer (boundDataItem);
    // boundDataItem is of type `Layer`.
}

编辑:我发现了一个 MouseLeftButtonDown 事件,但它没有给我点击的绑定数据项,只能获取图像或文本,但它们对于要查找的图像不是唯一的。

EDIT2:另一件事是即使使用MouseLeftButtonDown,它也只有在我点击TextBlock 本身时才有效,即使在同一个GridViewColumn 内也不能在它之外。

【问题讨论】:

    标签: c# .net wpf xaml binding


    【解决方案1】:

    您可以在根元素 (StackPanel.MouseLeftButtonDown) 上添加处理程序,然后在处理程序中使用var layer = (sender as FrameworkElement).DataContext as Layer 访问绑定的项目。

    【讨论】:

    • 那是坏人,它有效。您可能知道的一个问题是,它在项目限制/范围内正确注册了对堆栈面板项目的鼠标点击。但不在项目范围之外,这是有道理的,因为即使在 StackPanel 上。我想知道我是否可以注册点击,即使点击了该特定列中的任何位置?就像仍然获得相同的点击项目一样,但无论它们是直接点击还是它们存在于同一行。我应该尝试使项目长度(TextBlock 部分)与 gridviewcolumn 一样大吗?
    • 不幸的是,这将变得更加困难,因为 GridViewRowPresenter 只为每个元素提供它所请求的大小。如果静态宽度没问题,可以直接设置 StackPanel 的宽度。如果没有,你可以使用 Grids 和 SharedSizeGroup 来伪造它——如果你愿意,我可以举个例子。
    • 首先,将 StackPanel 的背景颜色设置为例如蓝色,所以你知道它有多宽。然后您可能会看到 TextBlock 在 StackPanel 中居中(我不确定为什么会这样;默认值为 Left)。但是 TreeView 是另一回事。您可能不想要静态宽度;您希望每个节点都延伸到 TreeView 的边缘。一个 hacky 方法是将 StackPanel 宽度设置为 9999 并限制 TreeView 的宽度。至于一个好方法......这可能值得自己提出问题。
    • 你好,有人问了类似的问题here。 publicgk 的答案是让 TreeView 内容伸展,所以这应该适合你。不幸的是,您必须重新模板化 TreeViewItem,这是我担心的,但您必须做您必须做的。
    • 是的,我想是的。 WPF 有时会让你这样做,而当它这样做时,它会很糟糕。
    猜你喜欢
    • 2016-03-29
    • 2016-09-23
    • 1970-01-01
    • 1970-01-01
    • 2011-02-05
    • 2011-06-11
    • 2023-03-30
    • 2019-10-09
    • 1970-01-01
    相关资源
    最近更新 更多