列表框内元素的唯一名称
Unique name for element inside of Listbox
我 运行 遇到一个问题,我需要在 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,所以我需要一个独特的名称?有更好的方法吗?
编辑: 好的,所以它编译并且 运行 很好(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>
请注意,我还将 TextBlock
的 Name
更改为 x:Name
。
我 运行 遇到一个问题,我需要在 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,所以我需要一个独特的名称?有更好的方法吗?
编辑: 好的,所以它编译并且 运行 很好(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>
请注意,我还将 TextBlock
的 Name
更改为 x:Name
。