2014-07-11 68 views
0

我已經在列表框中爲我的ListBoxItem創建了一個控件模板,並且每個ListBoxItem都由contentpresenter和一個圖像組成。通過點擊列表框中的特定元素來查找列表框

我對你的問題是......我怎麼知道,當我點擊列表框中的圖像時,我點擊了哪個列表框。

<Style x:Key="ListBoxItemWithDelete" TargetType="ListBoxItem"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="ListBoxItem"> 
         <Border Name="Border" Padding="2" SnapsToDevicePixels="true"> 
          <Grid> 
           <ContentPresenter VerticalAlignment="Center" /> 
           <Image Name="ImageListItemDelete" Source="../Resources/Images/actions-delete-big-1.png" Width="20" Style="{StaticResource MenuItemIcon}" HorizontalAlignment="Right" 
           MouseLeftButtonUp="ImageListItemDelete_MouseLeftButtonUp"/> 
          </Grid> 
         </Border> 
         <ControlTemplate.Triggers> 
          <Trigger Property="IsSelected" Value="true"> 
           <Setter TargetName="Border" Property="Background" Value="{StaticResource SelectedBackgroundBrush}"/> 
          </Trigger> 
          <Trigger Property="IsEnabled" Value="false"> 
           <Setter Property="Foreground" Value="{StaticResource DisabledForegroundBrush}"/> 
          </Trigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 

private void ImageListItemDelete_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
{ 
    //Object sender is my Image i Clicked. 
    if (ListBoxName.SelectedItem != null) 
    { 
    ListBoxName.Items.Remove(ListBoxName.SelectedItem); 
    } 
} 

我想用包含這個圖像的列表框替換ListBoxName,我點擊了,現在「ListBoxName」是硬編碼的。

我知道如何通過listboxitems找到他們的內容模板,但我不知道如何以相反的方式工作。 :/

回答

0

找到某個特定類型的UIElement的祖先的更好方法是使用VisualTreeHelper class。從鏈接頁面:

提供執行涉及視覺樹中節點的常見任務的實用方法。

您可以使用此輔助方法來找到你的ListBox

public T GetParentOfType<T>(DependencyObject element) where T : DependencyObject 
{ 
    Type type = typeof(T); 
    if (element == null) return null; 
    DependencyObject parent = VisualTreeHelper.GetParent(element); 
    if (parent == null && ((FrameworkElement)element).Parent is DependencyObject) 
     parent = ((FrameworkElement)element).Parent; 
    if (parent == null) return null; 
    else if (parent.GetType() == type || parent.GetType().IsSubclassOf(type)) 
     return parent as T; 
    return GetParentOfType<T>(parent); 
} 

你會使用這樣的:

ListBox listBox = GetParentOfType<ListBox>(sender as UIElement); 
+0

謝謝..這正是我正在尋找的。我知道另一個通過子元素向下穿過的人。 –

0

你得到的回答卻也未必總是如此,由於模板的差異,通過可視化樹或邏輯樹,所以尋找將是適當的

例如

public static T FindAncestor<T>(DependencyObject dependencyObject) where T : class 
{ 
    DependencyObject target = dependencyObject; 
    do 
    { 
     target = VisualTreeHelper.GetParent(target); 
    } 
    while (target != null && !(target is T)); 
    return target as T; 
} 

使用

ListBox listBox = FindAncestor<ListBox>(sender as DependencyObject); 

更復雜的例子在這裏Finding an ancestor of a WPF dependency object

+0

謝謝您的回答,我其實是尋找類似這而不是我自己的例子。 –

相關問題