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 Children。然后使用SelectedItemSelectedIndex属性选择上一个和下一个项目。

4

4 回答 4

3

WrapPanelPictures.Children[j + 1].Source无法工作,因为您试图访问其不存在的Source属性。UIElement您应该UIElement在访问之前将 to Image 转换为Source

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 是高度动态的(将图像拖放到包装面板或类似的东西中),那么使用绑定将您的数据与 UI 链接是可行的方法。无论如何,我也强烈建议考虑像 MVVM 这样的 ViewModel 模式。

于 2013-05-24T08:53:22.773 回答
0

使用方法FindVisualChildren。它遍历 Visual Tree 并找到您想要的控件。

这应该可以解决问题

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 回答
0

不要j在 foreach 循环内声明。否则,这将始终显示j=0WrapPanelPictures.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 回答