2013-05-12 51 views
3

我有一個WrapPanel其中包含一些圖像(縮略圖)。Loop雖然兒童元素,找東西,並訪問其兄弟財產

當用戶按左或右箭頭鍵,我想顯示下一個/上一個圖像。

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屬性。無論如何,這返回當前圖像顯示。我想要兄弟姐妹。

UPDATE: 那麼我提出了一個解決方法,就像現在一樣。但仍在等待一個合適的解決方案。

我創建了一個ListBox並將所有WrapPanel Childrens添加到它。然後使用SelectedItemSelectedIndex屬性來選擇上一個和下一個項目。

+0

你如何確定你的下一個和以前的起點(CurrentImage)? – WiiMaxx 2013-05-23 14:24:22

+0

@WiiMaxx「MainPic」的來源決定了當前顯示的圖片。按左右方向鍵可以改變當前的圖像。我想我應該指出/鏈接縮略圖圖片和當前顯示在一起的圖片。由於我不能這樣做(但),我必須遍歷所有WrapPanel兒童。 – xperator 2013-05-23 14:38:17

回答

3

WrapPanelPictures.Children[j + 1].Source因爲你試圖訪問的UIElementSource財產不存在不能正常工作。你應該投的UIElement到圖像訪問Source前:

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

我相信有更優雅的解決方案,以獲得相同的結果。

+0

這是工作:)正是我在找什麼。你說得對。應該有更好的解決方案來實現這一點。但這是我能想到的最接近的方法。試想一下,你有一個包含縮略圖的WrapPanel,並且你想用鍵瀏覽它們。 – xperator 2013-05-23 15:20:55

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 
} 
+0

我告訴過你,我想調用對象的(在本例中爲tb)同級屬性。不是本身。 – xperator 2013-05-12 08:58:43

0

不要聲明j foreach循環中。否則,這將始終顯示圖像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++; 
      } 
     } 
    } 
+0

好的我修好了那部分,但你錯過了這一點。我在說'WrapPanelPictures.Children [j + 1] .Source'的Source屬性不起作用。 – xperator 2013-05-12 08:47:39

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是高度動態的(拖/下降的圖像到畫布面板或類似的東西),使用綁定到您的數據鏈接用戶界面是要走的路。無論如何,我也強烈建議考慮像MVVM這樣的ViewModel模式。

+0

你是對的。我有你的想法,創建一個圖像列表,然後將它們添加到wrappanel中,然後將索引設置爲0,並使用列表導航,....我希望我可以與你分享這個repution賞金:D – xperator 2013-05-24 16:53:50

+0

不用擔心賞金,很高興你發現它很有用。 – 2013-05-28 07:42:59