2015-08-30 3 views
1

У меня возникла проблема, когда мне нужно указать UIElement внутри ListBox, но я не могу, потому что он будет проходить цикл и, очевидно, не может иметь миллион маленьких TextBlock работает с тем же именем.Уникальное имя элемента внутри Listbox

Вот моя упрощенная версия моего 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> 

Для моей ситуации я пытаюсь использовать AdaptiveTriggers на RelativePanel установить позиционирование secondText TextBlock справа от firstText, когда есть более широкий экран и снизу, когда есть меньший экран.

Насколько я знаю, единственный способ, которым я могу это изменить, - это использовать Setter для имени, поэтому мне нужно было бы как-то уникально? Есть лучший способ сделать это?

EDIT: Хорошо, так что компилируется и побежал штраф (RelativePanel.RightOf работает на начальном этапе), но AdaptiveTriggers не работает, и VS бросает tissy о разметке. Что я могу сделать?

ответ

3

Трюк состоит в том, чтобы обернуть элементы внутри вашего DataTemplate с помощью UserControl.

<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 «s Name к x:Name.

+0

Кроме того, убедитесь, что вы * имя * своей 'VisualState' тоже. –

+1

Большое вам спасибо! Работал как шарм. – m0ngr31

Смежные вопросы