У меня есть пользовательский элемент управления:отметкам в МОФ сетки
<UserControl x:Class="WpfExt.ColorLine.TimeLineControl"
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"
mc:Ignorable="d"
d:DesignHeight="40" d:DesignWidth="400">
<Grid x:Name="DynamicGrid">
</Grid>
</UserControl>
В коде позади:
public readonly static DependencyProperty TotalHoursProperty = DependencyProperty.Register("TotalHours",
typeof(int),
typeof(TimeLineControl),
new FrameworkPropertyMetadata(1, FrameworkPropertyMetadataOptions.AffectsParentMeasure, TotalHoursChangedCallback));
private static void TotalHoursChangedCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e)
{
((TimeLineControl)dependencyObject).ChangeTimeLineItems((int)e.NewValue);
}
public int TotalHours
{
get { return (int)GetValue(TotalHoursProperty); }
set { SetValue(TotalHoursProperty, value); }
}
private void ChangeTimeLineItems(int totalHours)
{
if (totalHours < 1 || totalHours > 24) throw new InvalidOperationException("TotalHours should be in 1..24 range.");
DynamicGrid.Children.Clear();
AddExtremeLine(0, HorizontalAlignment.Left);
for (var index = 1; index < totalHours * 2 - 1; index += 2)
{
AddLine(index, 30);
AddLine(index + 1, 40);
}
AddLine(totalHours * 2 - 1, 30);
AddExtremeLine(totalHours * 2, HorizontalAlignment.Right);
}
private void AddExtremeLine(int column, HorizontalAlignment horizontalAlignment)
{
var columnDefinition = new ColumnDefinition();
var gridLength = new GridLength(0.5, GridUnitType.Star);
columnDefinition.Width = gridLength;
DynamicGrid.ColumnDefinitions.Add(columnDefinition);
var line = new Line
{
X1 = 0,
X2 = 0,
Y1 = 20,
Y2 = 40,
Stroke = Brushes.Black,
StrokeThickness = 1,
HorizontalAlignment = horizontalAlignment
};
Grid.SetColumn(line, column);
DynamicGrid.Children.Add(line);
}
private void AddLine(int column, double y2)
{
var columnDefinition = new ColumnDefinition();
var gridLength = new GridLength(1, GridUnitType.Star);
columnDefinition.Width = gridLength;
DynamicGrid.ColumnDefinitions.Add(columnDefinition);
var line = new Line
{
X1 = 0,
X2 = 0,
Y1 = 20,
Y2 = y2,
Stroke = Brushes.Black,
StrokeThickness = 1,
HorizontalAlignment = HorizontalAlignment.Center
};
Grid.SetColumn(line, column);
DynamicGrid.Children.Add(line);
}
Так что, если я использую это нравится:
<colorLine:TimeLineControl Height="100" TotalHours="6" />
Это выглядит следующим образом:
Вопрос такой: Как я могу изменить свой код, чтобы мои линии масштабировались, чтобы заполнить высоту элементов управления, но сохраняйте существующее поведение при изменении ширины (только пространство между ними будет масштабироваться, но не линии).
Похоже, что в настоящее время присвоено свойство зависимостей и событие обратного вызова, нет фактической высоты, размера рендера и т. Д. http://i.imgur.com/FLMcx4z.png –