2014-04-20 64 views
0

我想創建一個自定義ItemsControl其中Item s的放置在一個StackPanel,與其他一些控制混(相當於),說Button。所以,我想下面是在佈局方面相當於:裝飾物品自定義的ItemsControl,不與ItemContainer

<StackPanel> 
    <Button>OK</Button> 
    <TextBox>Hello</TextBox> 
    <Button>OK</Button> 
    <TextBox>World</TextBox> 
</StackPanel> 

<CustomControlInQuestion> 
    <TextBox>Hello</TextBox> 
    <TextBox>World</TextBox> 
</CustomControlInQuestion> 

所有的替代道路,我走了下來(ItemContainer S,ItemTemplate S,定製Panel小號)未能創造出相當的這種行爲。有沒有什麼技術可以實現這一點?

這可能是值得強調的是,我真的需要這是一個自定義的控制:)

謝謝!

+0

只是好奇,這背後的原因,而不是組織按鈕+文本框爲一個單一的項目,讓那是你的用於ItemsControl的DataTemplate –

+0

這是因爲我非常希望將這些項目粘貼爲Grid的頂層元素,而不是按鈕,它們將成爲GridSplitters。 我讓這個例子有點讓人想起我的問題的核心,因爲網格方法還有其他問題,所以我希望這不會影響主題:) – Dan

回答

0

嗨,我只是給你一個提示,以達到你的要求,如果你熟悉ItemTemplateSelector, dataTemplate你可以自己做。

<ItemsControl x:Name="PanelControl" ItemsSource="{Binding bindYourSourceHere}" 
    ItemTemplateSelector="{StaticResource bindYourItemTemplateSelector}"> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <StackPanel Orientation="Vertical"/> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
</ItemsControl> 


//StackPanel is set to ItemsControl.ItemsPanel 
// Write a ItemTemplateSelector and write your own logic to select either button template or textbox template 
// In case if I misunderstood your requirement, please let me know it in more detail. 
0

這可能是一個起點你,迷你實現垂直堆疊面板的:

using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Markup; 

namespace TabControl1 
{ 
    public class CustomControl1 : Panel 
    { 
     protected override Size MeasureOverride (Size availableSize) 
     { 
      Size panelDesiredSize = new Size (0, 0); 

      foreach (UIElement child in this.InternalChildren) 
      { 
       var childMaxSize = new Size (double.PositiveInfinity, double.PositiveInfinity); 
       child.Measure (childMaxSize); 
       var v = (FrameworkElement)child; 

       panelDesiredSize.Width += child.DesiredSize.Width; 

       if (panelDesiredSize.Height < child.DesiredSize.Height) 
       { 
        panelDesiredSize.Height = child.DesiredSize.Height; 
       } 
      } 

      return panelDesiredSize; 
     } 

     protected override Size ArrangeOverride (Size finalSize) 
     { 
      double x = 0; 
      double y = 0; 

      foreach (UIElement child in this.InternalChildren) 
      { 
       child.Arrange (new Rect (new Point (x, y), child.DesiredSize)); 

       x += child.DesiredSize.Width; 
      } 

      return finalSize; // Returns the final Arranged size 
     } 
    } 
}