2015-09-25 81 views
-1

我试图实现一个自定义的多页对话框,它需要任意数量的图形(幻灯片)并显示它们。期望的行为将是所选项目将出现在前景中显示区域的顶部中心。前一张幻灯片将在左下角具有较低的Z指数,下一张幻灯片将在右下角具有较低的Z指数。 “上一个”和“下一个”按钮将设置选定的索引。在索引的设置方法中,我循环播放幻灯片,并根据每张幻灯片是隐藏的,选定的,在选定的幻灯片之前,还是在选定的幻灯片之后,设置一个名为“SelectionState”的整数值。我试图使用IValueConverters根据此整数定位幻灯片。WPF XAML自定义列表框不能正确定位元素

对于我的Listbox.ItemsPanelTemplate,我尝试使用网格。在ItemsTemplate中,我使用IValueConverters设置了Grid.Column和Grid.Row。通过代码,我可以看到值转换器正在被调用,并且它们正在返回适当的值,但所有项目都出现在行0,列0中。

在感到沮丧之后,我尝试将网格更改为Canvas并设置Canvas.Left和Canvas.Top属性,并且再次看到我从转换器中获得了很好的值,但是所有项都定位无论如何,在左上角。 (此代码显示,但已注释掉)

由于我知道值转换器的行为与预期的一样,其他人是否看到我在做什么错?提前感谢您的任何建议!

<Grid x:Name="DialogLayer"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="*" /> 
      <RowDefinition Height="420" /> 
      <RowDefinition Height="*" /> 
     </Grid.RowDefinitions> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="*" /> 
      <ColumnDefinition Width="1100" /> 
      <ColumnDefinition Width="*" /> 
     </Grid.ColumnDefinitions> 

     <ListBox x:Name="lbSlides" ItemsSource="{Binding CurrentFormSet.InterviewSlides}" Grid.Column="1" Grid.Row="1" ScrollViewer.HorizontalScrollBarVisibility="Hidden" ScrollViewer.VerticalScrollBarVisibility="Hidden"> 
      <ListBox.ItemsPanel> 
       <ItemsPanelTemplate> 
        <Grid> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition Width="250" /> 
          <ColumnDefinition Width="250" /> 
          <ColumnDefinition Width="100" /> 
          <ColumnDefinition Width="250" /> 
          <ColumnDefinition Width="250" /> 
         </Grid.ColumnDefinitions> 
         <Grid.RowDefinitions> 
          <RowDefinition Height="60" /> 
          <RowDefinition Height="300" /> 
          <RowDefinition Height="60" /> 
         </Grid.RowDefinitions> 
        </Grid> 
        <!--<Canvas Grid.Row="1" Grid.Column="1" />--> 
       </ItemsPanelTemplate> 
      </ListBox.ItemsPanel> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <!--<Border BorderBrush="Black" BorderThickness="1" Width="600" Height="360" Canvas.Top="{Binding SelectionState, Converter={StaticResource SelectionStateToCanvasTopConverter}}" Canvas.Left="{Binding SelectionState, Converter={StaticResource SelectionStateToCanvasLeftConverter}}" Panel.ZIndex="{Binding SelectionState, Converter={StaticResource SelectionStateToZIndexConverter}}"> 
         <TextBlock Text="Hello World" /> 
        </Border>--> 
        <Border BorderBrush="Black" BorderThickness="1" Width="600" Height="360" Grid.Column="{Binding SelectionState, Converter={StaticResource SelectionStateToGridColumnConverter}}" Grid.Row="{Binding SelectionState, Converter={StaticResource SelectionStateToGridRowConverter}}" Panel.ZIndex="{Binding SelectionState, Converter={StaticResource SelectionStateToZIndexConverter}}"> 
         <TextBlock Text="Hello World" /> 
        </Border> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 
    </Grid> 

回答

1

你必须通过设置ItemContainerStyle属性来设置项容器上的这些属性(即ListBoxItem中):

<ListBox.ItemContainerStyle> 
    <Style TargetType="ListBoxItem"> 
     <Setter Property="Grid.Column" Value="{Binding SelectionState, ...}"/> 
     <Setter Property="Grid.Row" Value="{Binding SelectionState, ...}"/> 
     <Setter Property="Panel.ZIndex" Value="{Binding SelectionState, ...}"/> 
    </Style> 
</ListBox.ItemContainerStyle> 
<ListBox.ItemTemplate> 
    <DataTemplate> 
     <Border BorderBrush="Black" BorderThickness="1" Width="600" Height="360"> 
      <TextBlock Text="Hello World" /> 
     </Border> 
    </DataTemplate> 
</ListBox.ItemTemplate> 
+0

太谢谢你了!我知道我必须错过简单的东西。 –