2010-03-28 36 views
1

我遇到以下問題:應用程序使用名爲ToolBox的自定義itemscontrol。工具箱的元素被稱爲toolboxitems,並且是自定義的contentcontrol。現在,工具箱中存儲了一些從數據庫中檢索並顯示的圖像。爲此,我使用工具箱控件內的數據模板。但是,當我嘗試拖放元素時,我沒有得到圖像對象,而是數據庫組件。我認爲我應該遍歷結構來找到Image元素。下面的代碼:WPF:如何從項目控件中找到數據項中的元素

工具箱:

public class Toolbox : ItemsControl 
    { 
     private Size defaultItemSize = new Size(65, 65); 
     public Size DefaultItemSize 
     { 
      get { return this.defaultItemSize; } 
      set { this.defaultItemSize = value; } 
     } 

     protected override DependencyObject GetContainerForItemOverride() 
     { 
      return new ToolboxItem(); 
     } 

     protected override bool IsItemItsOwnContainerOverride(object item) 
      { 
       return (item is ToolboxItem); 
      } 
    } 

的ToolboxItem:

public class ToolboxItem : ContentControl 
    { 
     private Point? dragStartPoint = null; 

     static ToolboxItem() 
     { 
      FrameworkElement.DefaultStyleKeyProperty.OverrideMetadata(typeof(ToolboxItem), new FrameworkPropertyMetadata(typeof(ToolboxItem))); 
     } 

     protected override void OnPreviewMouseDown(MouseButtonEventArgs e) 
     { 
      base.OnPreviewMouseDown(e); 
      this.dragStartPoint = new Point?(e.GetPosition(this)); 
     } 
     public String url { get; private set; } 


     protected override void OnMouseMove(MouseEventArgs e) 
     { 
      base.OnMouseMove(e); 
      if (e.LeftButton != MouseButtonState.Pressed) 
      { 
       this.dragStartPoint = null; 
      } 

      if (this.dragStartPoint.HasValue) 
      { 
       Point position = e.GetPosition(this); 
       if ((SystemParameters.MinimumHorizontalDragDistance <= 
        Math.Abs((double)(position.X - this.dragStartPoint.Value.X))) || 
        (SystemParameters.MinimumVerticalDragDistance <= 
        Math.Abs((double)(position.Y - this.dragStartPoint.Value.Y)))) 
       { 
        string xamlString = XamlWriter.Save(this.Content); 



        MessageBoxResult result = MessageBox.Show(xamlString); 
        DataObject dataObject = new DataObject("DESIGNER_ITEM", xamlString); 

        if (dataObject != null) 
        { 
         DragDrop.DoDragDrop(this, dataObject, DragDropEffects.Copy); 
        } 
       } 

       e.Handled = true; 
      } 
     } 
     private childItem FindVisualChild<childItem>(DependencyObject obj) 
    where childItem : DependencyObject 
     { 
      for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++) 
      { 
       DependencyObject child = VisualTreeHelper.GetChild(obj, i); 
       if (child != null && child is childItem) 
        return (childItem)child; 
       else 
       { 
        childItem childOfChild = FindVisualChild<childItem>(child); 
        if (childOfChild != null) 
         return childOfChild; 
       } 
      } 
      return null; 
     } 

    } 

這裏是工具箱,工具箱項XAML文件:

<Style TargetType="{x:Type s:ToolboxItem}"> 
     <Setter Property="Control.Padding" 
       Value="5" /> 
     <Setter Property="ContentControl.HorizontalContentAlignment" 
       Value="Stretch" /> 
     <Setter Property="ContentControl.VerticalContentAlignment" 
       Value="Stretch" /> 
     <Setter Property="ToolTip" 
       Value="{Binding ToolTip}" /> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type s:ToolboxItem}"> 
        <Grid> 
         <Rectangle Name="Border" 
            StrokeThickness="1" 
            StrokeDashArray="2" 
            Fill="Transparent" 
            SnapsToDevicePixels="true" /> 
         <ContentPresenter Content="{TemplateBinding ContentControl.Content}" 
              Margin="{TemplateBinding Padding}" 
              SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" 
              ContentTemplate="{TemplateBinding ContentTemplate}"/> 
        </Grid> 
        <ControlTemplate.Triggers> 
         <Trigger Property="IsMouseOver" 
           Value="true"> 
          <Setter TargetName="Border" 
            Property="Stroke" 
            Value="Gray" /> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

    <Style TargetType="{x:Type s:Toolbox}"> 
     <Setter Property="SnapsToDevicePixels" 
       Value="true" /> 
     <Setter Property="Focusable" 
       Value="False" /> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate> 
        <Border BorderThickness="{TemplateBinding Border.BorderThickness}" 
          Padding="{TemplateBinding Control.Padding}" 
          BorderBrush="{TemplateBinding Border.BorderBrush}" 
          Background="{TemplateBinding Panel.Background}" 
          SnapsToDevicePixels="True"> 
         <ScrollViewer VerticalScrollBarVisibility="Auto"> 

          <ItemsPresenter SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" /> 

          </ScrollViewer> 

        </Border> 

       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
     <Setter Property="ItemsPanel"> 
      <Setter.Value> 
       <ItemsPanelTemplate> 
        <WrapPanel Margin="0,5,0,5" 
           ItemHeight="{Binding Path=DefaultItemSize.Height, RelativeSource={RelativeSource AncestorType=s:Toolbox}}" 
           ItemWidth="{Binding Path=DefaultItemSize.Width, RelativeSource={RelativeSource AncestorType=s:Toolbox}}" /> 
       </ItemsPanelTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

</ResourceDictionary> 

用法示例:

<Toolbox x:Name="NewLibrary" DefaultItemSize="55,55" ItemsSource="{Binding}" > 
          <ItemsControl.ItemTemplate> 
           <DataTemplate> 
            <StackPanel> 
             <Image Source="{Binding Path=url}" /> 
            </StackPanel> 
           </DataTemplate> 

         </ItemsControl.ItemTemplate> 
          </Toolbox> 

我得到的對象是一個數據庫對象。當使用靜態資源時,我得到了Image對象。如何從數據模板中檢索這個Image對象?我雖然我可以使用本教程: http://msdn.microsoft.com/en-us/library/bb613579.aspx 但它似乎並沒有解決問題。 任何人都可以提出解決方案嗎? 謝謝!

回答

0

代碼的ToolboxItem的背後,調用方法就像他:

FindVisualChild<Image>(this); 

這工作對我很好,並返回我的預期圖像對象。

+0

非常感謝,viky。但是,數據模板在工具箱「內部」而不是工具箱內。我應該將它添加到工具箱還是工具箱項目? – EVA 2010-03-28 18:02:44

+0

我試過這段代碼: string xamlString = XamlWriter.Save(FindVisualChild (this)); 現在我得到一個空的圖像(沒有網址附加)。 – EVA 2010-03-28 18:57:09

相關問題