2012-01-03 2 views
1

Я хочу создать слайдер, который выглядит как последние два на этом изображении: http://www.java2s.com/Code/JavaImages/SliderTest.PNG Но я хочу, чтобы значения, отображаемые сверху, были линейно изменены, 10,100,1000,10000. И я хочу, чтобы пользователь определял эти значения.Пользовательский слайдер wp7

Когда я создал стиль с закодированными значениями это было нормально:

      <Grid x:Name="HorizontalTemplate" Margin="{StaticResource PhoneHorizontalMargin}"> 
           <Grid.ColumnDefinitions> 
            <ColumnDefinition Width="Auto"/> 
            <ColumnDefinition Width="12"/> 
            <ColumnDefinition Width="*"/> 
           </Grid.ColumnDefinitions> 
          <Grid.RowDefinitions> 
           <RowDefinition Height="Auto"/> 
           <RowDefinition Height="*"/> 
          </Grid.RowDefinitions> 
          <Grid> 
           <Grid.ColumnDefinitions> 
            <ColumnDefinition Width="*"/> 
            <ColumnDefinition Width="*"/> 
            <ColumnDefinition Width="*"/> 
            <ColumnDefinition Width="*"/> 
            <ColumnDefinition Width="*"/> 
            <ColumnDefinition Width="*"/> 
           </Grid.ColumnDefinitions> 
           <TextBlock Text="100m" Grid.Column="0" TextAlignment="Left"></TextBlock> 
           <TextBlock Text="500m" Grid.Column="1" TextAlignment="Center"></TextBlock> 
           <TextBlock Text="1km" Grid.Column="2" TextAlignment="Center"></TextBlock> 
           <TextBlock Text="10km" Grid.Column="3" TextAlignment="Center"></TextBlock> 
           <TextBlock Text="100km" Grid.Column="4" TextAlignment="Center"></TextBlock> 
           <TextBlock Text="All" Grid.Column="5" TextAlignment="Center" ></TextBlock>         
          </Grid> 
          <Rectangle x:Name="HorizontalFill" Fill="{TemplateBinding Foreground}" Height="12" IsHitTestVisible="False" Grid.Row="1"/> 
          <Rectangle x:Name="HorizontalTrack" Grid.Column="2" Fill="{TemplateBinding Background}" Height="12" IsHitTestVisible="False" Opacity="0.2" Grid.Row="1"/> 
          <RepeatButton x:Name="HorizontalTrackLargeChangeDecreaseRepeatButton" IsTabStop="False" Template="{StaticResource PhoneSimpleRepeatButton}" Grid.Row="1"/> 
          <RepeatButton x:Name="HorizontalTrackLargeChangeIncreaseRepeatButton" Grid.Column="2" IsTabStop="False" Template="{StaticResource PhoneSimpleRepeatButton}" Grid.Row="1"/> 
          <Thumb x:Name="HorizontalThumb" Grid.Column="1" Height="12" Width="12" Grid.Row="1"> 
            <Thumb.Template> 
             <ControlTemplate> 
              <Canvas Background="{StaticResource PhoneForegroundBrush}" Height="12" Width="12"> 
               <Rectangle Fill="Transparent" Height="84" IsHitTestVisible="True" Canvas.Left="-24" Canvas.Top="-22" Width="60"/> 
              </Canvas> 
             </ControlTemplate> 
            </Thumb.Template> 
           </Thumb> 
          </Grid> 

Но чем я изменил сетку, определяющую colums к этому:

<Grid Name="separatorsGrid" DataContext="{Binding GridSeparator}" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="3"/> 

и добавил свойство зависимостей к нему:

 public static readonly DependencyProperty SeparatorProperty = 
     DependencyProperty.Register("Separators", typeof(List<string>), typeof(CustomSlider), null); 

     public static readonly DependencyProperty GridSeparatorProperty = 
     DependencyProperty.Register("GridSeparator", typeof(Grid), typeof(CustomSlider), null); 

    public CustomSlider() 
    { 
     DefaultStyleKey = typeof(CustomSlider); 
    } 

    public List<string> Separators 
    { 
     get{ return base.GetValue(SeparatorProperty) as List<string>; } 
     set 
     { 
      Grid maingrid = new Grid(); 
      foreach (string separator in value) 
      { 
       ColumnDefinition col = new ColumnDefinition(); 
       maingrid.ColumnDefinitions.Add(col);      
      } 

      int colNum = -1; 
      foreach (string gridColumn in value) 
      { 
       colNum++; 
       TextBlock textBlock = new TextBlock(); 
       textBlock.Text = gridColumn; 
       Grid.SetRow(textBlock, 0); 
       Grid.SetColumn(textBlock, colNum); 
       maingrid.Children.Add(textBlock); // This line makes all the difference. 
      } 
      base.SetValue(GridSeparatorProperty, maingrid); 
     } 
    } 

    public Grid GridSeparator 
    { 
     get { return base.GetValue(GridSeparatorProperty) as Grid; } 
     set { base.SetValue(GridSeparatorProperty, value); } 
    } 

и по какой-либо причине это не работает, свойство зависимостей даже не указано d один раз. o.O, или если у кого-то есть аналогичное решение для этого, было бы неплохо.

Заранее спасибо

+0

Где вы устанавливаете 'Сепараторы' в вашей' Grid'? ' Ku6opr

+0

В Сепараторах вы не устанавливаете свойство Gridseparator, которое назначено сетке. –

+0

Просьба предоставить некоторый тестовый проект для его проверки – Ku6opr

ответ

1

Прежде всего, вы никогда не должны ставить код внутри DependencyProperty добытчиками и сеттеров. Не гарантируется, что этот код будет выполнен - ​​в некоторых случаях возникают прямые манипуляции с зависимыми свойствами.

Кроме того, если у вас есть привязка, источником должно быть свойство public.

И последнее, как вы собираетесь добавлять элементы и столбцы в сетку, используя DataContext из Grid?

+0

«И последнее, как вы собираетесь добавлять элементы и столбцы в сетку, используя DataContext Grid?» Именно об этом я и спрашиваю. –

+0

Но я вижу, что вы сделали это: D В настоящее время я понятия не имею, но я просмотрю его. Большое спасибо! –

+0

Посмотрите мой проект. Для этого я использовал GetTemplateChild. http://depositfiles.com/files/l7tghmbzp – Ku6opr

Смежные вопросы