2011-04-17 94 views
1

我想要在WPF中使用組合框來存儲一些名稱,但我希望組合框本身是垂直的,並且當您單擊它時,它應顯示每個項目與另一個45°旋轉,使其更具可讀性。喜歡的東西:L////WPF組合框 - 垂直顯示與45°旋轉項目

我取得了一些它這樣做:

     <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

這工作(如果我理解正確的,你想要什麼)

<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

嗯,這實際上更好,我要問如何讓組合框完全垂直,只有45°的子項。很好! – 2011-04-17 15:51:03

0

您可能需要重寫組合框的ItemTemplate這樣的 -

<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> 
+0

我已經試過了,但隨後表示45°空文本框。 – 2011-04-17 13:33:17

+0

您可以將代碼粘貼到運行時填充文本框的位置嗎?看着這可能會有所幫助.. – 2011-04-17 13:36:22

+0

我粘貼了代碼。 – 2011-04-17 14:38:28

0

您可以使用DataTemplate並添加BindingTextBox.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> 

而後面的代碼應該設置ItemsSourcem_CurrentData.PlayersInfo

this.combo.ItemsSource = m_CurrentData.PlayersInfo; 

理想情況下,這可以通過XAML中的綁定來完成,但是這樣做會起作用。請務必在您的XAML中設置xmlns:local定義,以便DataTemplate上的DataType起作用。

+0

請記住看到您編輯的反應式變化,您需要確保'PlayerInfo'類從'DependencyObject'繼承或實現'INotifyPropertyChanged'。 – user7116 2011-04-17 14:55:48

+0

它不能解決我的問題,讓組合框垂直站立完成。問題是從組合框顯示45°角的項目,以便它更具可讀性。 – 2011-04-17 15:27:05

+0

另外,關於綁定,我放棄了一陣子。我只是做舊的刷新。我的數據來自PHP/CLR,通過Phalanger,它存儲在字典等。最後但並非最不重要的是,m_CurrentData對象在新序列化之前被銷燬,所以即使PlayersInfo確實繼承了DependencyObject,它也不會有機會通知任何事情,還是我錯了? – 2011-04-17 15:34:37