1

いくつかのコントロールを含むページを作成しました。このページにある画像を取得する必要があります。文字列値として画像名を持っています。画像を見つけて戻るためにforループを作成しましたが、ページ内のすべてのコントロールをループするのは面倒で、それ以上の時間がかかります。

//文字列を渡し、画像として検索

Image imgBack = FindControl<Image>((UIElement)Layout, typeof(Image), strSelectedimg);

//画像を検索する関数

public T FindControl<T>(UIElement parent, Type targetType, string ControlName) where T : FrameworkElement
{
        if (parent == null) return null;
        if (parent.GetType() == targetType && ((T)parent).Name == ControlName)
        {
            return (T)parent;
        }
        T result = null;
        int count = VisualTreeHelper.GetChildrenCount(parent);
        for (int i = 0; i < count; i++)
        {
            UIElement child = (UIElement)VisualTreeHelper.GetChild(parent, i);
            if (FindControl<T>(child, targetType, ControlName) != null)
            {
                 result = FindControl<T>(child, targetType, ControlName);
                 break;
            }
         }
         return result;
     }     

文字列値を使用してページ内の画像を見つける他の簡単な方法はありますか?

4

2 に答える 2

0

Silverlight Toolkit を使用する場合、このヘルパー メソッドを自分で維持する必要はありません。拡張メソッドとして既に同様のメソッドが付属しているためです。

using System.Linq;
using System.Windows.Controls.Primitives;

// ...

private void DoStuff()
{
    var myImage = this.MyRootLayoutPanel.GetVisualDescendants().OfType<Image>()
        .Where(img => img.Name == "MyImageName").FirstOrDefault();
}

または、正確なシナリオはわかりませんが、単純なまたはでControlはなく適切にテンプレート化されたものを作成している場合は、次のようにしますUserControlPage

public class MyFancyControl : Control
{
    public MyFancyControl()
    {
        this.DefaultStyleKey = typeof(MyFancyControl);
    }

    // ...

    public override void OnApplyTemplate()
    {
        var myImage = this.GetTemplateChild("MyImageName") as Image;
    }
}
于 2012-09-21T17:10:36.827 に答える
0

おそらく、画像を追加すると同時にルックアップを作成できます。実行時に画像を追加するコードを投稿すると、より正確な答えが得られます。しかし、私は次のようなことを考えています:

private Dictionary<string, Image> _imageLookup;

private class ImageInfo
{
    public string Name { get; set; }
    public string Uri { get; set; }
}

private void AddImages(ImageInfo[] imageInfos)
{
    this._imageLookup = new Dictionary<string, Image>();
    foreach (var info in imageInfos)
    {
        var img = CreateImage(info.Name, info.Uri);
        if (!this._imageLookup.ContainsKey(info.Name))
        {
            this._imageLookup.Add(info.Name, img);
        }
        AddImageToUI(img);
    }
}

private Image CreateImage(string name, string uri)
{
    // TODO: Implement
    throw new NotImplementedException();
}

private void AddImageToUI(Image img)
{
    // TODO: Implement
    throw new NotImplementedException();
}

その後、後で簡単に画像を見つけることができます。

public Image FindControl(string strSelectedImg)
{
    if (this._imageLookup.ContainsKey(strSelectedImg))
    {
        return this._imageLookup[strSelectedImg];
    }
    else
    {
        return null; // Or maybe throw exception
    }
}

画像以外を検索する必要がある場合は、代わりにDictionary<string, Control>orを使用できますDictionary<string, UIElement>

于 2012-09-21T16:45:57.387 に答える