Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何获得ListView(GridView)单元格';当用鼠标单击时,将显示内容_C#_Wpf_Listview_Gridview - Fatal编程技术网

C# 如何获得ListView(GridView)单元格';当用鼠标单击时,将显示内容

C# 如何获得ListView(GridView)单元格';当用鼠标单击时,将显示内容,c#,wpf,listview,gridview,C#,Wpf,Listview,Gridview,我试图获取GridView中“单元格”的文本值,该GridView被设置为ListView的视图。我不想获取ListView的SelectedItem,因为它只返回我的整个视图模型(但不返回单元格引用的属性) 我可以通过响应直接鼠标事件(上下或其他)来获取文本值,如果该值是textblock,显然我可以使用文本。这非常有效,目前这是我唯一的解决方案,尽管目前有限 我想更进一步,能够在单元格区域中的任意位置单击,四处导航以找到合适的文本块,然后使用该值。我已经尝试了50万种方法来做到这一点,但似乎

我试图获取GridView中“单元格”的文本值,该GridView被设置为ListView的视图。我不想获取ListView的SelectedItem,因为它只返回我的整个视图模型(但不返回单元格引用的属性)

我可以通过响应直接鼠标事件(上下或其他)来获取文本值,如果该值是textblock,显然我可以使用文本。这非常有效,目前这是我唯一的解决方案,尽管目前有限

我想更进一步,能够在单元格区域中的任意位置单击,四处导航以找到合适的文本块,然后使用该值。我已经尝试了50万种方法来做到这一点,但似乎合乎逻辑的方法似乎并没有像它应该的那样奏效

设置: 我有一个动态GridView,它根据我传递给它的数据模型创建自己的列和绑定。我正在使用一个编程单元模板(如下所示)对单元进行单独控制,特别是这样我可以在其中添加一个“边框”,使其实际分离出每个单元。我命名了这些对象,以便在VisualTree中导航时更容易访问它们

这是模板代码。(请注意,内容演示者最初是一个文本块本身,但为了以后的灵活性,对其进行了更改)

私有数据模板GetCellTemplate(字符串bindingName)
{
StringBuilder=新的StringBuilder();
生成器。追加(“”);
生成器。追加(“”);
生成器。追加(“”);
生成器。追加(“”);
生成器。追加(“”);
生成器。追加(“”);
生成器。追加(“”);
DataTemplate cellTemplate=(DataTemplate)XamlReader.Parse(builder.ToString());
返回单元格模板;
}
我所尝试的: 对我来说,合乎逻辑的方法是对鼠标事件做出反应。从具有鼠标事件的对象中,我可以 A.查看其子项以查找文本块,或 B.获取其父对象,然后使用文本块查找子对象

我的假设是,如果我在空白处单击,我在一个包含文本块的容器中单击。到目前为止,出现的两种情况是边框和矩形(如果我不单击文本本身)。A.除了重排和边界外,绝对不返回任何内容。当我做B时,我可以找到文本块,但它们是整行中的每一个文本块

所以我试着从中得到所有的文本块,然后往回走,直到我发现哪个文本块的IsMouseOver属性为true。事实证明,除了整行的content presenter之外,这些对象都没有IsMouseOver。因此,这似乎向我表明,单元格中的空白实际上并不包含textblock

我发现,当我单击边框并开始查看子对象时,最终会找到一个包含矩形(我单击的矩形)和网格行视图演示器的容器。presenter显示行中的所有对象(因此,当我进行递归扫描时,我将获得所有TextBlock)

下面是一些代码,用来了解我在做什么。我已经写了10个不同版本的递归代码,试图找出谁在上面有鼠标,谁与文本框相关

private void OnPreviewMouseUp(object sender, MouseButtonEventArgs e)
    {
        object original = e.OriginalSource;
        if (original is TextBlock)
        {
            this.valueTextBlock.Text = ((TextBlock)original).Text;
        }
        else if (original is FrameworkElement)
        {
            var result = GetAllNestedChildren<Border>(VisualTreeHelper.GetParent((DependencyObject)original)).Where(x => x.Name == "border").Where(x => HasAChildWithMouse(x)).ToList();

        }
        else
        {
            this.valueTextBlock.Text = string.Empty;
        }
    }

    private bool HasAChildWithMouse(UIElement element)
    {
        if (element.IsMouseOver || element.IsMouseDirectlyOver)
            return true;
        var childCount = VisualTreeHelper.GetChildrenCount(element);
        for (int i = 0; i < childCount; ++i)
        {
            var child = VisualTreeHelper.GetChild(element, i);
            if (child is UIElement)
                if (HasAChildWithMouse((UIElement)child))
                    return true;
        }
        return false;
    }
private IEnumerable<T> GetAllNestedChildren<T>(DependencyObject obj) where T : UIElement
    {
        if (obj is T)
            yield return obj as T;
        var childCount = VisualTreeHelper.GetChildrenCount(obj);
        for (int i = 0; i < childCount; ++i)
        {
            var child = VisualTreeHelper.GetChild(obj, i);
            foreach (var nested in GetAllNestedChildren<T>(child))
                yield return nested; 
        }
    }

    private T GetObjectByTypeParentHasMouse<T>(DependencyObject obj) where T : UIElement
    {
        if (obj is T)
        {
            if ((VisualTreeHelper.GetParent(obj) as UIElement).IsMouseOver )
            {
                return obj as T;
            }
        }
        var childCount = VisualTreeHelper.GetChildrenCount(obj);
        for (int i = 0; i < childCount; ++i)
        {
            var child = VisualTreeHelper.GetChild(obj, i);
            var correctType = GetObjectByTypeParentHasMouse<T>(child);
            if (correctType != null)
                return correctType;
        }
        return null;
    }

    private T GetContainedType<T>(DependencyObject obj, bool checkForMouseOver) where T : UIElement 
    {
        if (obj is T && ((T)obj).IsMouseOver)
            return obj as T;
        var childCount = VisualTreeHelper.GetChildrenCount(obj);
        for (int i = 0; i < childCount; ++i)
        {
            var child = VisualTreeHelper.GetChild(obj, i);
            var correctType = GetContainedType<T>(child, checkForMouseOver);
            if (correctType != null)
                return correctType;
        }
        return null;
    }
private void OnPreviewMouseUp(对象发送器,鼠标按钮ventargs e)
{
对象原始=e.原始源;
如果(原件为文本块)
{
this.valueTextBlock.Text=((TextBlock)原件).Text;
}
else if(原始是FrameworkElement)
{
var result=GetAllNestedChildren(VisualTreeHelper.GetParent((DependencyObject)original))。其中(x=>x.Name==“border”)。其中(x=>HasAChildWithMouse(x)).ToList();
}
其他的
{
this.valueTextBlock.Text=string.Empty;
}
}
私有布尔HasAChildWithMouse(UIElement)
{
if(element.IsMouseOver | | element.IsMouseDirectlyOver)
返回true;
var childCount=VisualTreeHelper.GetChildrenCount(元素);
对于(int i=0;iprivate void OnPreviewMouseUp(object sender, MouseButtonEventArgs e)
    {
        object original = e.OriginalSource;
        if (original is TextBlock)
        {
            this.valueTextBlock.Text = ((TextBlock)original).Text;
        }
        else if (original is FrameworkElement)
        {
            var result = GetAllNestedChildren<Border>(VisualTreeHelper.GetParent((DependencyObject)original)).Where(x => x.Name == "border").Where(x => HasAChildWithMouse(x)).ToList();

        }
        else
        {
            this.valueTextBlock.Text = string.Empty;
        }
    }

    private bool HasAChildWithMouse(UIElement element)
    {
        if (element.IsMouseOver || element.IsMouseDirectlyOver)
            return true;
        var childCount = VisualTreeHelper.GetChildrenCount(element);
        for (int i = 0; i < childCount; ++i)
        {
            var child = VisualTreeHelper.GetChild(element, i);
            if (child is UIElement)
                if (HasAChildWithMouse((UIElement)child))
                    return true;
        }
        return false;
    }
private IEnumerable<T> GetAllNestedChildren<T>(DependencyObject obj) where T : UIElement
    {
        if (obj is T)
            yield return obj as T;
        var childCount = VisualTreeHelper.GetChildrenCount(obj);
        for (int i = 0; i < childCount; ++i)
        {
            var child = VisualTreeHelper.GetChild(obj, i);
            foreach (var nested in GetAllNestedChildren<T>(child))
                yield return nested; 
        }
    }

    private T GetObjectByTypeParentHasMouse<T>(DependencyObject obj) where T : UIElement
    {
        if (obj is T)
        {
            if ((VisualTreeHelper.GetParent(obj) as UIElement).IsMouseOver )
            {
                return obj as T;
            }
        }
        var childCount = VisualTreeHelper.GetChildrenCount(obj);
        for (int i = 0; i < childCount; ++i)
        {
            var child = VisualTreeHelper.GetChild(obj, i);
            var correctType = GetObjectByTypeParentHasMouse<T>(child);
            if (correctType != null)
                return correctType;
        }
        return null;
    }

    private T GetContainedType<T>(DependencyObject obj, bool checkForMouseOver) where T : UIElement 
    {
        if (obj is T && ((T)obj).IsMouseOver)
            return obj as T;
        var childCount = VisualTreeHelper.GetChildrenCount(obj);
        for (int i = 0; i < childCount; ++i)
        {
            var child = VisualTreeHelper.GetChild(obj, i);
            var correctType = GetContainedType<T>(child, checkForMouseOver);
            if (correctType != null)
                return correctType;
        }
        return null;
    }