2015-03-23 3 views
1

У меня есть пользовательский элемент управления:отметкам в МОФ сетки

<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" /> 

Это выглядит следующим образом:

enter image description here

Вопрос такой: Как я могу изменить свой код, чтобы мои линии масштабировались, чтобы заполнить высоту элементов управления, но сохраняйте существующее поведение при изменении ширины (только пространство между ними будет масштабироваться, но не линии).

ответ

-1

Измените настройки Y1, Y2 на что-то на основе RenderSize.Height. то есть что-то вроде:

Y1 = Grid.RenderHeight - 40; 
Y2 = Grid.RenderHeight - 20; 

Очевидно переключатель 20 & 40, как ваш сейчас «измерения» количества белого пространства, чтобы оставить, а не по длине линии.

+0

Похоже, что в настоящее время присвоено свойство зависимостей и событие обратного вызова, нет фактической высоты, размера рендера и т. Д. http://i.imgur.com/FLMcx4z.png –

1

Если речь идет только о контроле, который рисует тики в показанном порядке, я думаю, что сделаю это по-другому и создаю очень маленький пользовательский элемент управления. Это все, что вам нужно, и очень очевидно, как это работает. Вы можете добавлять свойства зависимостей по своему усмотрению (например, часы). Просто используя этот способ, он заполняет все заданное пространство.

public class HourTicks : FrameworkElement 
{ 
    static HourTicks() 
    { 
    } 

    protected override void OnRender (DrawingContext drawingContext) 
    { 
     int hours = 10; 
     Pen pen = new Pen(Brushes.Black, 1); 

     drawingContext.DrawLine (pen, new Point (0, 0), new Point (0, ActualHeight)); 
     drawingContext.DrawLine (pen, new Point (ActualWidth, 0), new Point (ActualWidth, ActualHeight)); 

     int numTicks = hours * 2; 
     double delta = ActualWidth/numTicks; 
     double x = delta; 

     for (int i = 0; i <numTicks; i++) 
     { 
      drawingContext.DrawLine (pen, new Point (x, 0), new Point (x, ActualHeight/3)); 
      x += delta; 
      drawingContext.DrawLine (pen, new Point (x, 0), new Point (x, ActualHeight/2)); 
      x += delta; 
     } 
    } 
} 
Смежные вопросы