列表框内元素的唯一名称

本文关键字:唯一 元素 列表 | 更新日期: 2023-09-27 18:10:33

我遇到了一个问题,我需要在ListBox中命名一个UIElement,但我不能,因为它会循环,显然不能有一百万个小TextBlock的运行与相同的名称

这是我的ListBox的简化版本:

<ListBox Background="Transparent">
    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Setter Property="HorizontalContentAlignment" Value="Stretch" />                            
        </Style>
    </ListBox.ItemContainerStyle>
    <ListBox.ItemTemplate>
       <DataTemplate>
            <RelativePanel">
                <TextBlock FontSize="12" Text="{Binding Path=Hub}" FontWeight="Bold" Name="firstText" />
                <TextBlock FontSize="12" Text="{Binding Path=Stats.Pages}" Name="secondText" RelativePanel.RightOf="firstText" />
                <VisualStateManager.VisualStateGroups>
                    <VisualStateGroup>
                        <VisualState>
                            <VisualState.StateTriggers>
                                <AdaptiveTrigger MinWindowWidth="1100" />
                            </VisualState.StateTriggers>
                            <VisualState.Setters>
                                <Setter Target="secondText.(RelativePanel.RightOf)" Value="hubText" />
                            </VisualState.Setters>
                        </VisualState>
                        <VisualState>
                            <VisualState.StateTriggers>
                                <AdaptiveTrigger MinWindowWidth="0" />
                            </VisualState.StateTriggers>
                            <VisualState.Setters>
                                <Setter Target="secondText.(RelativePanel.Below)" Value="firstText" />
                            </VisualState.Setters>
                        </VisualState>
                    </VisualStateGroup>
                </VisualStateManager.VisualStateGroups>
            </RelativePanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

对于我的情况,我试图在RelativePanel上使用AdaptiveTriggers来设置secondText TextBlock的位置,当有一个更宽的屏幕时,firstText的右边,当有一个更小的屏幕时,在下面。

据我所知,我能改变这一点的唯一方法是在名称上使用Setter,所以我需要一个唯一的?有更好的方法吗?

EDIT:好吧,所以它编译和运行良好(RelativePanel。RightOf最初是工作的),但是AdaptiveTriggers不起作用,VS对标记很恼火。我能做什么?

列表框内元素的唯一名称

技巧是用UserControl包裹DataTemplate内部的元素。

<ListBox.ItemTemplate>
    <DataTemplate>
        <UserControl>
            <RelativePanel>
                <VisualStateManager.VisualStateGroups>
                    <VisualStateGroup>
                        <VisualState x:Name="Wide">
                            <VisualState.StateTriggers>
                                <AdaptiveTrigger MinWindowWidth="1100" />
                            </VisualState.StateTriggers>
                            <VisualState.Setters>
                                <Setter Target="secondText.(RelativePanel.RightOf)" Value="hubText" />
                            </VisualState.Setters>
                        </VisualState>
                        <VisualState x:Name="Normal">
                            <VisualState.StateTriggers>
                                <AdaptiveTrigger MinWindowWidth="0" />
                            </VisualState.StateTriggers>
                            <VisualState.Setters>
                                <Setter Target="secondText.(RelativePanel.Below)" Value="firstText" />
                            </VisualState.Setters>
                        </VisualState>
                    </VisualStateGroup>
                </VisualStateManager.VisualStateGroups>
                <TextBlock FontSize=" 12" Text="hub" FontWeight="Bold" x:Name="hubText" />
                <TextBlock FontSize="12" Text="first" x:Name="firstText" RelativePanel.RightOf="hubText" />
                <TextBlock FontSize="12" Text="second" x:Name="secondText" RelativePanel.RightOf="firstText" />
            </RelativePanel>
        </UserControl>
    </DataTemplate>
</ListBox.ItemTemplate>

请注意,我还将TextBlockName更改为x:Name