2014-11-20 6 views
0

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

enter image description here

На рисунке показано, как я разработал окно. В Списке коробка и B представляет элемент и пользователь соответственно и ItemsControl, который представляет собой сетку из кнопок действуют как клетка, которые пользователи нажимают на, чтобы применить настройки, которые они хотят соответствующий и B.

Проблема у меня есть, я должен быть в состоянии сделать две вещи

а) Когда пользователь прокручивает слева направо, или наоборот - Listbox А стационарная кнопка сетки и Listbox B прокрутки в синхронном

б) Когда пользователь прокручивает сверху вниз, или наоборот - Listbox B неподвижна кнопка сетка и Listbox свитка в синхронном

в настоящее время я поставил Listbox а и сетка кнопки в общем просмотре прокрутки и я могу достичь условия б). Но не условие а). Для достижения обоих условий а) и б) мне придется отделить Listbox A и сетку кнопок и связать их свойства прокрутки. Так что я пытался что-то вроде этого

ScrollViewer scrollView = null; 
    ScrollViewer scrollView2 = null; 


    void scrollView_ScrollChanged(object sender, ScrollChangedEventArgs e) 
    { 
     var newOffset = e.VerticalOffset; 

     if ((null != scrollView) && (null != scrollView2)) 
     { 
      scrollView.ScrollToVerticalOffset(newOffset); 
      scrollView2.ScrollToVerticalOffset(newOffset); 
     } 
    } 


    private ScrollViewer getScrollbar(DependencyObject dep) 
    { 
     for (int i = 0; i < VisualTreeHelper.GetChildrenCount(dep); i++) 
     { 
      var child = VisualTreeHelper.GetChild(dep, i); 
      if ((null != child) && child is ScrollViewer) 
      { 
       return (ScrollViewer)child; 
      } 
      else 
      { 
       ScrollViewer sub = getScrollbar(child); 
       if (sub != null) 
       { 
        return sub; 
       } 
      } 
     } 
     return null; 
    } 

    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     scrollView = getScrollbar(dataGrid1); 
     scrollView2 = getScrollbar(dataGrid2); 

     if (null != scrollView) 
     { 
      scrollView.ScrollChanged += new ScrollChangedEventHandler(scrollView_ScrollChanged); 
     } 
     if (null != scrollView2) 
     { 
      scrollView2.ScrollChanged += new ScrollChangedEventHandler(scrollView_ScrollChanged); 
     } 
    } 

Я изменил код, чтобы удовлетворить свои потребности, конечно, но когда я развязаны Listbox и кнопку сетки они не были приведены в соответствие друг с другом больше, и когда-либо я прокручивается кнопку сетка (или просмотр прокрутки) в списках A и B не будут синхронизироваться, они прокручивают величины быстрее, чем просмотр прокрутки.

В заключение необходимо создать элемент управления, где пользователи могут назначить выбранные параметры для элементов в списках и B, выбрав соответствующую кнопку на панели кнопок сетки. Листы с списком A и B должны быть полностью выровнены с соответствующей кнопкой настроек в сетке кнопок. И я хотел бы позволить пользователям выполнять прокрутки действий а) и б), как объяснялось выше. Мне нужна помощь/советы по этой проблеме.

PS: код синхронизации прокрутки от этого stackoverflow question и идея кнопки сетки от here

ответ

0

Я не уверен, я полностью понимаю вопрос, но вы можете пересмотреть свой код, используя этот подход:

<StackPanel Grid.IsSharedSizeScope="True"> 
     <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition SharedSizeGroup="col1"/> 
       <ColumnDefinition SharedSizeGroup="col2"/> 
      </Grid.ColumnDefinitions> 
      <TextBlock Text="some text"/> 
      <TextBlock Text="some other text" Grid.Column="1"/> 
     </Grid> 

     <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition SharedSizeGroup="col1"/> 
       <ColumnDefinition SharedSizeGroup="col2"/> 
      </Grid.ColumnDefinitions> 
      <TextBlock Text="text"/> 
      <TextBlock Text="a very very long text" Grid.Column="1"/> 
     </Grid> 
    </StackPanel> 
+0

Спасибо Bizz, попробуем это – NANDAGOPAL

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