2009-07-02 4 views
3

Это сводит меня с ума. Кажется, я не могу получить шаблон данных в своем ComboBox, чтобы растянуть ширину раскрывающегося списка. Что дает?Stretch ComboBox Содержимое в Silverlight

<Grid x:Name="LayoutRoot" Background="White"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="30" /> 
     <RowDefinition Height="*" /> 
    </Grid.RowDefinitions> 
    <ComboBox x:Name="SearchesComboBox" HorizontalContentAlignment="Stretch" Width="150"> 
     <ComboBox.ItemContainerStyle> 
      <Style TargetType="ComboBoxItem"> 
       <Setter Property="HorizontalContentAlignment" Value="Stretch"/> 
      </Style> 
     </ComboBox.ItemContainerStyle> 
     <ComboBox.ItemTemplate> 
      <DataTemplate> 
       <Border BorderBrush="Black" BorderThickness="1"> 
        <TextBlock Text="{Binding}" Margin="2" /> 
       </Border> 
      </DataTemplate> 
     </ComboBox.ItemTemplate> 
     <sys:String>Two</sys:String> 
     <sys:String>Four</sys:String> 
     <sys:String>Six</sys:String> 
    </ComboBox> 
</Grid> 

ответ

2

Хорошо, после того, как через день возится с ним, у меня есть решение. Я ненавижу его, но он работает. В основном, я размышлял о System.Windows.dll для Silverlight, и я вырвал шаблон по умолчанию для ListBoxItem (который использует ComboBoxItem).

Оказалось, что в этом шаблоне есть ContentPresenter с горизонтальным выравниванием, жестко закодированным влево. Итак, я сорвал шаблон и добавил TemplateBinding для HorizontalAlignment, поэтому он может использовать все, что HorizontalAlignment ComboBoxItem.

Это, как говорится, следует за рабочим кодом. Если у ANYONE есть лучший способ сделать это, пожалуйста, скажите мне. Я еще не проверял, если это исправлено в версии 3.0. Надеюсь, это так. Это действительно должно быть связано с ComboBox.HorizontalContentAlignment.

<UserControl.Resources> 
    <Style x:Key="FixedComboBoxItem" TargetType="ComboBoxItem"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="ComboBoxItem"> 
        <Grid Background="{TemplateBinding Background}"> 
         <vsm:VisualStateManager.VisualStateGroups> 
          <vsm:VisualStateGroup x:Name="CommonStates"> 
           <vsm:VisualState x:Name="Normal" /> 
           <vsm:VisualState x:Name="MouseOver"> 
            <Storyboard> 
             <DoubleAnimation Storyboard.TargetName="fillColor" Storyboard.TargetProperty="Opacity" Duration="0" To=".35"/> 
            </Storyboard> 
           </vsm:VisualState> 
           <vsm:VisualState x:Name="Disabled"> 
            <Storyboard> 
             <DoubleAnimation Storyboard.TargetName="contentPresenter" Storyboard.TargetProperty="Opacity" Duration="0" To=".55" /> 
            </Storyboard> 
           </vsm:VisualState> 
          </vsm:VisualStateGroup> 
          <vsm:VisualStateGroup x:Name="SelectionStates"> 
           <vsm:VisualState x:Name="Unselected" /> 
           <vsm:VisualState x:Name="Selected"> 
            <Storyboard> 
             <DoubleAnimation Storyboard.TargetName="fillColor2" Storyboard.TargetProperty="Opacity" Duration="0" To=".75"/> 
            </Storyboard> 
           </vsm:VisualState> 
          </vsm:VisualStateGroup> 
          <vsm:VisualStateGroup x:Name="FocusStates"> 
           <vsm:VisualState x:Name="Focused"> 
            <Storyboard> 
             <ObjectAnimationUsingKeyFrames Storyboard.TargetName="FocusVisualElement" Storyboard.TargetProperty="Visibility" Duration="0"> 
              <DiscreteObjectKeyFrame KeyTime="0"> 
               <DiscreteObjectKeyFrame.Value> 
                <Visibility>Visible</Visibility> 
               </DiscreteObjectKeyFrame.Value> 
              </DiscreteObjectKeyFrame> 
             </ObjectAnimationUsingKeyFrames> 
            </Storyboard> 
           </vsm:VisualState> 
           <vsm:VisualState x:Name="Unfocused"/> 
          </vsm:VisualStateGroup> 
         </vsm:VisualStateManager.VisualStateGroups> 
         <Rectangle x:Name="fillColor" Opacity="0" Fill="#FFBADDE9" IsHitTestVisible="False" RadiusX="1" RadiusY="1"/> 
         <Rectangle x:Name="fillColor2" Opacity="0" Fill="#FFBADDE9" IsHitTestVisible="False" RadiusX="1" RadiusY="1"/> 
         <ContentPresenter 
          x:Name="contentPresenter" 
          Content="{TemplateBinding Content}" 
          ContentTemplate="{TemplateBinding ContentTemplate}" 
          HorizontalAlignment="{TemplateBinding HorizontalAlignment}" 
          Margin="{TemplateBinding Padding}"/> 
         <Rectangle x:Name="FocusVisualElement" Stroke="#FF6DBDD1" StrokeThickness="1" Visibility="Collapsed" RadiusX="1" RadiusY="1" /> 
        </Grid> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</UserControl.Resources> 

<Grid x:Name="LayoutRoot" Background="White"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="30" /> 
     <RowDefinition Height="*" /> 
    </Grid.RowDefinitions> 
    <ComboBox x:Name="SearchesComboBox" Width="150" ItemContainerStyle="{StaticResource FixedComboBoxItem}" HorizontalContentAlignment="Stretch"> 
     <ComboBox.ItemTemplate> 
      <DataTemplate> 
       <Border BorderBrush="Black" BorderThickness="1" > 
        <TextBlock Text="{Binding}" Margin="2" /> 
       </Border> 
      </DataTemplate> 
     </ComboBox.ItemTemplate> 
     <sys:String>Two</sys:String> 
     <sys:String>Four</sys:String> 
     <sys:String>Six</sys:String> 
    </ComboBox> 
</Grid> 
2

Я только что подтвердил следующие работы в WPF, перемещая HorizontalContentAlignment до ComboBox:

<ComboBox x:Name="SearchesComboBox" HorizontalContentAlignment="Stretch" Width="150"> 
    <ComboBox.ItemTemplate> 
    <DataTemplate> 
     <Border BorderBrush="Black" BorderThickness="1"> 
     <TextBlock Text="{Binding}" Margin="2" /> 
     </Border> 
    </DataTemplate> 
    </ComboBox.ItemTemplate> 
    <sys:String>Two</sys:String> 
    <sys:String>Four</sys:String> 
    <sys:String>Six</sys:String> 
</ComboBox> 

Позвольте мне знать, если это также устраняет проблему в Silverlight. Проблема в том, что я видел это, элементы в раскрывающемся списке были правильно отсортированы, а контент, показанный в выпадающем списке, не растягивался.

+0

Нет, к сожалению, это не работает в Silverlight. Элементы в раскрывающемся списке НЕ правильны, но содержимое в заголовке правильно выполнено. Вождение меня безумное :) –

+0

Просто сделал тест с Silverlight 5, и этот подход решает проблему для меня. – Rus

3
<ComboBox.ItemContainerStyle> 
    <Style TargetType="ComboBoxItem"> 
     <Setter Property="HorizontalContentAlignment" Value="Stretch"/> 
    </Style> 
</ComboBox.ItemContainerStyle> 
+0

Было бы даже лучше, если бы вы объяснили код, который вы опубликовали. – 2012-10-28 00:32:03

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