2016-07-22 82 views
0

我的事件处理程序背后的代码:BringIntoView时不工作

private void comboActiveStudentAssignmentType_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    List<Border> borders = new List<Border>(); 

    // The list of border (focus rectangles) matches the combo of assignment types 
    borders.Add(borderBibleReadingMain); 
    borders.Add(borderBibleReadingClass1); 
    borders.Add(borderBibleReadingClass2); 
    borders.Add(borderMainHallStudent1); 
    borders.Add(borderMainHallAssistant1); 
    borders.Add(borderMainHallStudent2); 
    borders.Add(borderMainHallAssistant2); 
    borders.Add(borderMainHallStudent3); 
    borders.Add(borderMainHallAssistant3); 
    borders.Add(borderClass1Student1); 
    borders.Add(borderClass1Assistant1); 
    borders.Add(borderClass1Student2); 
    borders.Add(borderClass1Assistant2); 
    borders.Add(borderClass1Student3); 
    borders.Add(borderClass1Assistant3); 
    borders.Add(borderClass2Student1); 
    borders.Add(borderClass2Assistant1); 
    borders.Add(borderClass2Student2); 
    borders.Add(borderClass2Assistant2); 
    borders.Add(borderClass2Student3); 
    borders.Add(borderClass2Assistant3); 

    // Loop through the borders 
    for(int iBorder = 0; iBorder < borders.Count; iBorder++) 
    { 
     // Is this border the active student assignment? 
     if (comboActiveStudentAssignmentType.SelectedIndex == iBorder) 
     { 
      // Yes, so use a red brush for the background 
      borders[iBorder].BorderBrush = Brushes.Red; 

      // Now we must ensure the correct tab item is visible 
      if(iBorder >= 0 && iBorder <= 2) 
      { 
       expandTFGW.IsExpanded = true; 

       if (iBorder == 0) 
        tabTFGWReadingMainHall.IsSelected = true; 
       else if (iBorder == 1) 
        tabTFGWReadingClass1.IsSelected = true; 
       else if (iBorder == 2) 
        tabTFGWReadingClass2.IsSelected = true; 
      } 
      else if (iBorder >= 3 && iBorder <= 8) 
      { 
       expandAYFM.IsExpanded = true; 
       tabAYFMStudentsMainHall.IsSelected = true; 

       if (iBorder == 3 || iBorder == 4) 
        tabMainHallItem1.IsSelected = true; 
       else if (iBorder == 5 || iBorder == 6) 
        tabMainHallItem2.IsSelected = true; 
       else if (iBorder == 7 || iBorder == 8) 
        tabMainHallItem3.IsSelected = true; 
      } 
      else if (iBorder >= 9 && iBorder <= 14) 
      { 
       expandAYFM.IsExpanded = true; 
       tabAYFMStudentsClass1.IsSelected = true; 

       if (iBorder == 9 || iBorder == 10) 
        tabClass1Item1.IsSelected = true; 
       else if (iBorder == 11 || iBorder == 12) 
        tabClass1Item2.IsSelected = true; 
       else if (iBorder == 13 || iBorder == 14) 
        tabClass1Item3.IsSelected = true; 
      } 
      else if (iBorder >= 15) 
      { 
       expandAYFM.IsExpanded = true; 
       tabAYFMStudentsClass2.IsSelected = true; 

       if (iBorder == 15 || iBorder == 16) 
        tabClass2Item1.IsSelected = true; 
       else if (iBorder == 17 || iBorder == 18) 
        tabClass2Item2.IsSelected = true; 
       else if (iBorder == 19 || iBorder == 20) 
        tabClass2Item3.IsSelected = true; 
      } 

      borders[iBorder].BringIntoView(); 
     } 
     else 
     { 
      // No, so set the background to transparent so we can't see it. 
      borders[iBorder].BorderBrush = Brushes.Transparent; 
     } 
    } 
} 

}

在XAML的Border对象之一的一个例子:

<Border x:Uid="borderMainHallStudent1" x:Name="borderMainHallStudent1" BorderThickness="5"> 
    <Border.Style> 
     <Style x:Uid="Style_30" TargetType="Border"> 
      <Setter x:Uid="Setter_76" Property="BorderBrush" Value="Transparent"/> 
      <Style.Triggers> 
       <DataTrigger x:Uid="DataTrigger_29" Binding="{Binding SelectedItem, ElementName=comboActiveStudentAssignmentType}" 
         Value="{x:Static StudentInfoEnums:StudentAssignmentType.Student1Main}"> 
        <Setter x:Uid="Setter_77" Property="BorderBrush" Value="Red"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Border.Style> 
    <StackPanel x:Uid="StackPanel_35"> 
     <Label x:Uid="Label_38" Content="Student:"/> 
     <Grid x:Uid="Grid_15"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition x:Uid="ColumnDefinition_34" Width="*"/> 
       <ColumnDefinition x:Uid="ColumnDefinition_35" Width="auto"/> 
      </Grid.ColumnDefinitions> 
      <TextBox x:Uid="textMainHallStudent1" x:Name="textMainHallStudent1" 
       Text="{Binding MainHallStudent1, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
       IsEnabled="False" Grid.Column="0" Margin="2" /> 
      <Button x:Uid="buttonMainHallStudent1" x:Name="buttonMainHallStudent1" Grid.Column="1" Background="Transparent" 
       DataContext="{Binding DataContext, ElementName=oclmEditor}" 
       Command="{Binding ApplicationCommand}" 
       CommandParameter="Student1Main"> 
       <Image x:Uid="Image_17" Source="Images/AssignmentTypeStudent16.png" Margin="2"/> 
      </Button> 
     </Grid> 
     <Label x:Uid="Label_39" Content="Study:"/> 
     <ComboBox x:Uid="ComboBox_9" DataContext="{Binding DataContext, ElementName=oclmEditor}" 
       ItemsSource="{Binding StudentStudyPointsList}" 
       ItemContainerStyle="{StaticResource StudyPointComboBoxStyle}" 
       ItemTemplate="{StaticResource StudyPointComboItem}" 
       Validation.ErrorTemplate="{StaticResource StudyPointValidationTemplate}" 
       Tag="{Binding Meeting.MainHallStudent1, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" 
       SelectedValue="{Binding Meeting.MainHallStudent1StudyNumber, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
       SelectedValuePath="Number"/> 
    </StackPanel> 
</Border> 

此行的代码: borders[iBorder].BringIntoView();它似乎没有工作。我的所有Border对象的颜色都设置正确,但程序显然没有尝试对这一行代码进行操作。

为了让你在那里此Border对象存在的情况下:

\\ Main Window 
    \\ScrollView 
     \\ Expander 
      \\Tab Control 
      \\Tab Item 
       \\Border 1 
        \\Contents 
       \\Border 2 
        \\Contents 
     \\ Expander 
      \\Tab Control 
      \\Tab Item 
       \\Border 1 
        \\Contents 
       \\Border 2 
        \\Contents 
+0

还有一个建议,就是无关你的问题 - 你建立你的UI的方式是非常不WPF- ISH。您应该查看数据绑定集合。它可以为您节省大量重复性代码。 –

+0

@EliArbel我正在使用数据绑定集合。这在XAML代码片段中显示。但仍然在学习。这个特定的代码仅用于UI。 –

回答

1

BringIntoView(),根据MSDN

尝试将此元素放入视图中,任何滚动区域内它包含在内。

因此,它不会选择标签项目,扩展扩展等,你需要自己做。

请注意,由于调度程序的优先级队列,只要您进行更改(例如选择选项卡),内容可能就不可用。在这种情况下,你可能希望发布一个较低的优先级外带到观看请求:

var localBorderIndex = iBorder; // copy to avoid closure of loop variable 
Dispatcher.InvokeAsync(() => borders[localBorderIndex].BringIntoView(), 
    DispatcherPriority.Background); 
+0

我忘了在上下文中包含'ScrollView'。我有一个。我应该在相关的'Expander'上使用'BringIntoView',而不是因为它们是'ScrollView'的直接子节点?我认为命令会卷起可视化树来查找我看到的“ScrollView”。而且,如果你看看我的代码,我已经在执行BringIntoView调用之前扩展了扩展器并设置了选项卡**。 –

+0

对不起,没有注意到。那么这可能是一个时间问题。我会更新我的答案。 –

+0

谢谢。现在它工作正常。但也许你可以以某种方式与我讨论你的评论重复代码。我正在使用数据绑定,但如果我可以更多地使用它并简单地使用我的XAML和/或代码,我想知道这一点。 –