3

WrapPanelいくつかの画像(サムネイル)を含む があります。

ユーザーが左または右の矢印キーを押すと、次/前の画像を表示したい。

private void frmMain_KeyUp(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Right)
    {
        int j = 0;
        foreach (Image child in WrapPanelPictures.Children)
        {
            if (child.Source == MainPic.Source)
            {
                MainPic.Source = WrapPanelPictures.Children[j + 1].Source;
            }
            j++;
        }
    }
}

また、LINQ アプローチを試してみましたが、LINQ の初心者です。

var imgfound = from r in WrapPanelPictures.Children.OfType<Image>()
               where r.Source == MainPic.Source
               select r;
MessageBox.Show(imgfound.Source.ToString());

imgfound はリストのはずですよね?たぶんそれが Source プロパティにアクセスできない理由です。とにかく、これは表示されている現在の画像を返します。兄弟が欲しい。

更新:まあ、私は今のところ回避策を作りました。しかし、まだ適切な解決策を待っています。

ListBox を作成し、すべての WrapPanel Childrens をそれに追加しました。次に、 プロパティSelectedItemSelectedIndexプロパティを使用して、前の項目と次の項目を選択しました。

4

4 に答える 4

3

存在しないプロパティWrapPanelPictures.Children[j + 1].Sourceにアクセスしようとしているため、は機能しません。にアクセスする前に、 を Image にキャストする必要があります。SourceUIElementUIElementSource

MainPic.Source = (WrapPanelPictures.Children[j + 1] as Image).Source;

同じ結果を得るためのよりエレガントなソリューションがあると確信しています。

于 2013-05-23T15:08:29.330 に答える
1

Novitchi で Source プロパティにアクセスできない理由がわかりました。それにもかかわらず、コードを再考することをお勧めします。

私の見方では、ラップ パネルの表示内容を制御できます。つまり、「すべての画像」や選択したインデックスなどをフィールドまたはプロパティに保存できる必要があります。毎回ラップ パネルの子の画像を解析して画像ソースを比較する代わりに、選択した画像またはインデックスが何であるかを常に把握しておく必要があります。

コードは大まかに次のようになります。

private List<BitmapImage> _images;
private int _selectedIndex;

private void frmMain_KeyUp(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Right)
    {
        _selectedIndex = (_selectedIndex + 1) % _images.Count;
        MainPic.Source = _images[_selectedIndex];
    }
}

UI が非常に動的である場合 (画像をラップ パネルにドラッグ アンド ドロップするなど)、Bindings を使用してデータを UI にリンクする方法があります。いずれにせよ、MVVM のような ViewModel パターンを検討することも強くお勧めします。

于 2013-05-24T08:53:22.773 に答える
0

jforeach ループ内で宣言しないでください。それ以外の場合、これは常に画像を表示しj=0ます WrapPanelPictures.Children[1]

    private void frmMain_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Right)
        {
           int j = 0;
           foreach (Image child in WrapPanelPictures.Children)
           {
                // int j = 0;
                if (child.Source == MainPic.Source)
                {
                    MainPic.Source = WrapPanelPictures.Children[j + 1].Source;
                    break;
                }
                j++;
            }
        }
    }
于 2013-05-12T08:40:24.710 に答える
0

使用方法FindVisualChildren。ビジュアル ツリーをトラバースし、目的のコントロールを見つけます。

これでうまくいくはずです

public static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
{
if (depObj != null)
{
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
    {
        DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
        if (child != null && child is T)
        {
            yield return (T)child;
        }

        foreach (T childOfChild in FindVisualChildren<T>(child))
        {
            yield return childOfChild;
        }
    }
}
}

次に、次のようにコントロールを列挙します

foreach (TextBlock tb in FindVisualChildren<TextBlock>(window))
{
    // do something with tb here
}
于 2013-05-12T08:13:07.713 に答える