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>

WPF XAML自定义列表框不能正确定位元素

您必须通过设置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>