0

私はWPFに問題があります-私はこのスマートテクノロジーにまったく慣れていません。したがって、問題は次のとおりです。

窓があります。このウィンドウのリソースに要素を保存しました-例:一意のキーを持つグリッド(x:Key = "myGrid"と想定)。このグリッドには、名前(x:Name = "myTextBox")で識別されるTextBoxがあります。マイウィンドウには、空のグリッド(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));

そして今、myGridの子孫であるmyTextBlockへの参照を取得したいと思います。

私は次のようなことを試みました

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

もちろん、これは機能しません。

あなたが私を理解してくれることを願っています、私が欲しいもの。どうもありがとう!

4

3 に答える 3

2

これを行うことはできません(ちなみに、できますが、それは本当に悪く、醜く、お勧めできません)別の目的を果たすためのウィンドウのリソース。

前述のように、コンポーネント(Usercontrolまたはその他)を作成する必要があります。ただし、求めるものには他にもいくつかのオプションがあります。あなたは私が以下に書いたもののいくつかを試すことができます:


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 に答える