WPF XAML自定义列表框不能正确定位元素
本文关键字:定位 元素 不能 XAML 自定义 列表 WPF | 更新日期: 2023-09-27 18:14:46
我正在尝试实现一个自定义的多页对话框,该对话框采用任意数量的视觉效果(幻灯片)并显示它们。期望的行为是选中的项目将出现在前景显示区域的顶部中心。前一张幻灯片位于左下角,z指数较低,下一张幻灯片位于右下角,z指数较低。"上一步"answers"下一步"按钮将设置所选索引。在索引的set方法中,我循环遍历幻灯片并设置一个名为"SelectionState"的整数值,该值基于每张幻灯片是被隐藏、被选中、在被选中的幻灯片之前还是之后。我正在尝试使用IValueConverters基于此整数来定位幻灯片。
用于我的列表框。ItemsPanelTemplate,我尝试使用网格。在ItemsTemplate中,我设置了网格。列和网格。行使用IValueConverters。逐步浏览代码,我可以看到正在调用值转换器,并且它们正在返回适当的值,但是所有项都出现在第0行第0列中。
沮丧之后,我尝试将网格更改为画布并设置画布。左侧和画布。顶部属性,再一次,我可以看到我从转换器得到了很好的值,但所有的项目都位于左上角。(显示了这段代码,但被注释掉了)
既然我知道值转换器的行为是预期的,还有人看到我做错了什么吗?提前感谢您的任何建议!
<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>
您必须通过设置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>