0

我对 WPF 有疑问 - 我对这项智能技术很陌生。所以问题是:

我有一个窗户。在这个窗口的资源中,我存储了一个元素 - 例如。具有唯一键的网格(假设 x:Key="myGrid")。在这个网格中,我有一个由名称 (x:Name="myTextBox") 标识的文本框。我的窗口只包含一个空网格(例如名为 winGrid)。我以编程方式将 myGrid 设置为 winGrid 的子项。现在,在运行时,我想获得对 myTextBox 对象的引用。我花了很多时间在谷歌上搜索,但对我没有任何帮助(FindName 和类似方法)。

你有什么想法吗,我必须做些什么才能让球滚动?

这是(伪)代码片段:

<Window x:Class="LoginForm.RidicWindow"
    ...>
<Window.Resources>
    <Grid x:Key="myGrid">
        <Border...
        <Grid...
            ...
            <TextBlock x:Name="myTextBlock" Grid.Column="0".../>
         </Grid>
    </Grid>
 </Window.Resources>
 <Grid x:Name="winGrid">
     ...
 </Grid>

现在我将 myGrid 设置为 winGrid 的子项:(类似于)

winGrid.Childrens.Clear();
winGrid.Childrens.Add((Grid)FindResource(myGrid));

现在我想获得对 myTextBlock 的引用,它是 myGrid 的后代。

我尝试了类似的东西

((Grid)FindResource(myGrid)).FindByName("myTextBlock");

这当然行不通。

希望你能理解我,我想要得到什么。非常感谢!

4

3 回答 3

2

你不能这样做(顺便说一句,你可以,但它真的很糟糕,丑陋,不推荐)一个窗口的资源用于另一个目的。

如前所述,您必须创建一个组件(用户控件或其他)。尽管您所寻求的还有一些其他选项。您可以尝试我在下面写的一些内容:


1)创建自定义组件可能是 UserControl、Grid 或其他任何东西...

    <Grid x:Class="Project.MyGridControl"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                 mc:Ignorable="d" 
                 d:DesignHeight="300" d:DesignWidth="300">
<!-- Content -->
    </Grid>

        MyGridControl control = new MyGridControl();
        winGrid.Childrens.Add(control);


2)稍微复杂一点:

<Grid  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <!-- Content -->
</Grid>

Grid myCustomGrid = XamlReader.Load(uriResource) as Grid;
winGrid.Childrens.Add(myCustomGrid);

在此选项中,您将无需实例化网格控件。(我看到它经常在报告中使用)。您应该创建一个 .xaml 并将其定义为资源。


要查找组件,您应该查看可视化树(如已响应)...

如何按名称或类型查找 WPF 控件?

于 2012-06-26T23:57:13.727 回答
0

小绵羊的评论提供了一个良好的开端,尽管我建议创建一个 UserControl,然后通过控件上的属性公开 TextBox 以简化操作。

但是,如果您的设计要求您使用上面概述的方法,您将需要使用 VisualTreeHelper,特别是 GetChild() 方法来导航 VisualTree 以在网格中查找 TextBox。我已经使用下面的方法在可视化树中查找项目,它可能会为您解决问题。

    /// <summary>
    /// Will navigate down the VisualTree to find an element that is of the provided type.
    /// </summary>
    /// <typeparam name="T">The type of object to search for</typeparam>
    /// <param name="element">The element to start searching at</param>
    /// <returns>The found child or null if not found</returns>
    public static T GetVisualChild<T>(DependencyObject element) where T : DependencyObject
    {
        T child = default(T);
        int childrenCount = VisualTreeHelper.GetChildrenCount(element);

        for (int i = 0; i < childrenCount; i++) 
        {
            DependencyObject obj = VisualTreeHelper.GetChild(element, i);
            if (obj is T)
            {
                child = (T)obj;
                break;
            }
            else
            {
                child = GetVisualChild<T>(obj);
                if (child != null)
                    break;
            }
        }

        return child;
    }

只需调用 GetVisualChild(myGrid),它就会返回它在 myGrid 中出现的第一个 TextBox。

希望这可以帮助。

于 2012-06-26T23:55:30.303 回答
-1

如果您只想在整个应用程序的任何层次结构中查找资源,那么试试这个...

   var myResource = Application.Current.FindResource("MyResource");
于 2012-06-27T08:06:49.357 回答