2015-09-25 51 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

太謝謝你了!我知道我必須錯過簡單的東西。 –