2016-05-04 5 views
0

У меня есть Usercontrol звонок ChartBase, и у меня есть различные оси UserControls, которые я могу разместить на нем. Если я использую его, как это, все в порядке:WPF: Как сгруппировать usercontrols в коллекцию

<UserControl x:Class="Chart_1.ChartBase" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:Chart_1" 
      mc:Ignorable="d" 
      x:Name="ThisControl" 
      d:DesignHeight="700" d:DesignWidth="1050"> 

<Grid 
    x:Name="LayoutRoot" 
    DataContext="{Binding ElementName=ThisControl}" 
    Height="{Binding ActualHeight}" 
    Width="{Binding ActualWidth}"> 

    <Grid.RowDefinitions> 
     <RowDefinition Height="20*"/> 
     <RowDefinition Height="60*"/> 
     <RowDefinition Height="20*"/> 
    </Grid.RowDefinitions> 


    <TextBlock x:Name="TitleTB" Grid.Row="0" Text="Title" TextAlignment="Center" Margin="20"/> 


    <Viewbox Grid.Row="1" Stretch="Uniform"> 

     <Canvas x:Name="ChartCanvas"      
       Background="AliceBlue" 
       Height="{Binding ActualHeight}" 
       Width="{Binding ActualWidth}"> 

      <local:RuledTopAxis 
       AxisBrush="Red" 
       AxisThickness="2" 
       Length="{Binding ElementName=ChartCanvas, Path=ActualWidth}" 
       TickBrush="Purple" 
       TickSize="10" 
       TickThickness="3" 
       TickInterval="50" 
       ChartWidth="{Binding ElementName=ChartCanvas, Path=ActualWidth}" 
       ChartHeight="{Binding ElementName=ChartCanvas, Path=ActualHeight}"/> 


      <local:LeftAxis 
       AxisBrush="Green" 
       AxisThickness="2" 
       Length="{Binding ElementName=ChartCanvas, Path=ActualHeight}" 
       TickBrush="Goldenrod" 
       TickSize="20" 
       TickThickness="3" 
       TickInterval="30" 
       ChartWidth="{Binding ElementName=ChartCanvas, Path=ActualWidth}" 
       ChartHeight="{Binding ElementName=ChartCanvas, Path=ActualHeight}"/> 

     </Canvas> 
    </Viewbox> 

    <Grid x:Name="LegendSpace" Grid.Row ="2" Background="Transparent" Margin="20" > 
     <TextBlock Text="Legend space" TextAlignment="Center"/> 
    </Grid> 
</Grid> 

То, что я хотел бы сделать, это заменить, что ряд осей с коллекцией AxisGroup, так что ChartBase действительно может быть базовым классом, и я могу извлечь из него разные классы с различными типами коллекции осей. То, что я попытался было определить новый UserControl под названием AxisGroup только с следующий XAML

<ItemsControl 
    DataContext = ThisControl 
    ItemsSource="{Binding Children}" /> 

где Children является ДП AxisGroup, который держит `ObservableCollection. Тогда я могу заменить последовательность осей в ChartBase по:

<local:AxisGroup> 
    <AxisGroup.Children> 
     <local:Axis_type1 
      ... 
      Length = "{Binding ElementName=ChartCanvas, Path=ActualWidth}" 
      ... /> 
     <local:Axis_type2 ... /> 
    </AxisGroup.Children> 
</local:AxisGroup> 

Конечно, идея не определить осей в XAML, но определить их в коде позади различных подклассов; но это просто для проверки. Это вид работ. Я получаю две оси, но не там, где я хочу, чтобы они были, а не правильной длины.

Проблема заключается в том, что базовый класс Axis работает. То, что я делаю для всех осей, задает горизонтальную LineGeometry, добавляет некоторые тики, указывающие вниз, и некоторые метки ниже этого. Затем в классе BottomAxis я установил RenderTransform, чтобы перевести его в нижнюю часть холста. Для LeftAxis, я поворачиваю, переворачиваю, переводим, чтобы получить его там, где я хочу. Все это делается в базовом классе, а производные классы просто устанавливают некоторые параметры преобразований. Это работает в первом примере, но не работает с осями в элементе управления AxisGroup. Я подозреваю, что это проблема DataContext, но я не вижу пути.

Жаль, что это было так долго ... Спасибо за любые идеи.

ответ

0

Это, конечно, так просто, как с указанием ItemsPanel:

<ItemsControl 
DataContext = ThisControl 
ItemsSource="{Binding Children}" > 
    <ItemsControl.ItemsPanel> 
     <Canvas /> 
    </ItemsControl.ItemsPanel> 
</ItemsControl> 
Смежные вопросы