У меня есть 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, но я не вижу пути.
Жаль, что это было так долго ... Спасибо за любые идеи.