WPF ComboBox - Вертикальный дисплей с поворотом на 45 ° - PullRequest
1 голос
/ 17 апреля 2011

Я хочу использовать ComboBox в WPF для хранения некоторых имен, но я хочу, чтобы сам комбобокс был вертикальным, и при нажатии на него он будет отображать каждый элемент с поворотом еще на 45 °, чтобы он был более читабельным.Что-то вроде: l / / / /

Я достиг кое-чего, сделав это:

                        <ComboBox Name="combo" 
                                  Grid.Row="0" Grid.Column="1" 
                                  HorizontalAlignment="Center" 
                                  VerticalAlignment="Center">
                            <ComboBox.LayoutTransform>
                                <RotateTransform Angle="270" />
                            </ComboBox.LayoutTransform>
                            <ComboBox.Items>                                
                                <TextBox>
                                    <TextBox.LayoutTransform>
                                        <RotateTransform Angle="315" />
                                    </TextBox.LayoutTransform>
                                </TextBox>
                            </ComboBox.Items>
                        </ComboBox>

Я заполняю комбинированный список следующим образом:

        m_Main.combo.Items.Clear();
        foreach (PlayerInfo player in m_CurrentData.PlayersInfo)
        {
            m_Main.comboPlayer1.Items.Add(player.Name);                    
        }

Но толькопервый элемент поворачивается, плюс я получаю пустой элемент поверх фактических элементов (я заполняю элементы в выпадающем списке во время выполнения).Что я делаю не так?

РЕДАКТИРОВАТЬ: больше нет пустых элементов, когда я очищаю элементы.

Ответы [ 3 ]

3 голосов
/ 17 апреля 2011

Это работает (если я правильно понял, что вы хотите)

<Page
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <Grid>  
    <ComboBox HorizontalAlignment="Center" VerticalAlignment="Center" MinWidth="100">
      <ComboBox.LayoutTransform>
        <RotateTransform Angle="270" />
      </ComboBox.LayoutTransform>
      <ComboBox.ItemsPanel>
        <ItemsPanelTemplate>
          <StackPanel Orientation="Vertical" IsItemsHost="True">
            <StackPanel.LayoutTransform>
              <RotateTransform Angle="90" />
            </StackPanel.LayoutTransform>
          </StackPanel>
        </ItemsPanelTemplate>
      </ComboBox.ItemsPanel>
      <ComboBox.ItemContainerStyle>
        <Style TargetType="ComboBoxItem">
          <Setter Property="LayoutTransform">
            <Setter.Value>
              <RotateTransform Angle="315" />
            </Setter.Value>
          </Setter>
        </Style>
      </ComboBox.ItemContainerStyle>
      <ComboBoxItem>Hello</ComboBoxItem>
      <ComboBoxItem>World</ComboBoxItem>
      <ComboBoxItem>Foo</ComboBoxItem>
      <ComboBoxItem>Bar</ComboBoxItem>
    </ComboBox>
  </Grid>
</Page>

enter image description here

0 голосов
/ 17 апреля 2011

Вы можете использовать DataTemplate и добавить Binding к свойству TextBox.Text.Теперь я предполагаю, что вы хотите изменить имя, потому что вы используете TextBox.В своем нынешнем виде ваш код не будет поддерживать редактирование этих строк, потому что они неизменны.Поэтому мой ответ предполагает, что вы хотите их отредактировать:

<ComboBox x:Name="combo" 
          Grid.Row="0" Grid.Column="1" 
          HorizontalAlignment="Center" 
          VerticalAlignment="Center">
    <ComboBox.Resources>         
        <DataTemplate DataType="{x:Type local:PlayerInfo}">
             <TextBox Text="{Binding Name}">
                 <TextBox.LayoutTransform>
                     <RotateTransform Angle="270" />
                 </TextBox.LayoutTransform>
             </TextBox>
        </DataTemplate>
    </ComboBox.Resources>
</ComboBox>

И ваш код должен установить ItemsSource в m_CurrentData.PlayersInfo.

this.combo.ItemsSource = m_CurrentData.PlayersInfo;

В идеале это будетбыть сделано через привязки в XAML, но в нынешнем виде это будет работать.Обязательно настройте определение xmlns:local в вашем XAML, чтобы DataType на DataTemplate работал.

0 голосов
/ 17 апреля 2011

Возможно, вам понадобится переопределить шаблон элемента списка, как это -

<ComboBox Name="combo"
              HorizontalAlignment="Center"
              VerticalAlignment="Center">
        <ComboBox.LayoutTransform>
            <RotateTransform Angle="270" />
        </ComboBox.LayoutTransform>
        <ComboBox.ItemTemplate>
            <DataTemplate>
                 <TextBox Text="{Binding Mode=OneWay}">
                <TextBox.LayoutTransform>
                    <RotateTransform Angle="315" />
                </TextBox.LayoutTransform>
            </TextBox>
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...