2013-06-24 1 views
0

J'ai vu pas mal de gens poser cette question et je me sens comme ma question est légèrement différente. J'ai une liste déroulante qui contient une série de contrôles utilisateur personnalisés identiques. Ces contrôles sont ajoutés à la zone de liste lors de l'exécution. Maintenant, j'ai actuellement mes éléments de listbox se redimensionner correctement lors de la première création et l'insertion dans le contrôle.contenu Listbox pas re-dimensionnement dynamique lorsque la taille Listbox change

est ici la plus étrange. Si je redimensionne la zone de liste, les contrôles qui ont été visibles précédemment ne sont pas redimensionnés à la nouvelle largeur de liste. En d'autres termes si j'ajoute 12 contrôles et la boîte montre seulement 4 (le reste est caché par une barre de défilement) alors si je redimensionne la boîte les 4 premiers contrôles seront toujours la largeur originale et si je défile alors l'autre 8 sera le taille correcte. Aussi, si je manipule les éléments de la liste d'une manière quelconque, ils se redimensionnent automatiquement à la largeur appropriée. SEE EDIT2

J'ai essayé d'attacher à l'événement sizeChanged et d'émettre ce qui suit sur la liste et les éléments, mais cela n'a eu aucun effet. Je pense que je dois trouver un moyen de réinitialiser les informations de mise en page pour les éléments de la liste, mais je ne trouve pas la commande.

item.InvalidateArrange(); 
item.InvalidateMeasure(); 
Layers.UpdateLayout(); 
item.UpdateLayout(); 

Je pense que cela a quelque chose à voir avec les articles que je suis en ajoutant parce que même si je Détachez les articles de la lisbox puis les attacher, ils restent la mauvaise largeur.

Voici mon code listbox:

<ListBox x:Name="Layers" VerticalContentAlignment="Top" Margin="0,17,0,0" BorderThickness="0,1,0,0" HorizontalContentAlignment="Stretch" SizeChanged="Layers_SizeChanged"> 
         <ListBox.ItemContainerStyle> 
          <Style TargetType="ListBoxItem"> 
           <Setter Property="HorizontalContentAlignment" Value="Stretch"/> 
          </Style> 
         </ListBox.ItemContainerStyle> 
        </ListBox> 

Voici le code pour mes articles

<UserControl x:Class="ListOverlayItem" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:data="clr-namespace:Data" 
HorizontalContentAlignment="Stretch"> 

<UserControl.Resources> 
    <data:Translator x:Key="translatorString" /> 
</UserControl.Resources> 

<Border BorderBrush="Silver" BorderThickness="0,0,0,0" Name="border1" HorizontalAlignment="Stretch"> 
    <Grid x:Name="layout" HorizontalAlignment="Stretch"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="19"/> 
      <RowDefinition Height="25" /> 
     </Grid.RowDefinitions> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="20" /> 
      <ColumnDefinition Width="*" /> 
      <ColumnDefinition Width="60" /> 
     </Grid.ColumnDefinitions> 
     <!-- Column 0 --> 
     <ScrollBar Name="arrangeIcon" FlowDirection="LeftToRight" Maximum="10" SmallChange="1" Value="5" Grid.Column="0" Grid.Row="0" Grid.RowSpan="2"/> 

     <!-- Column 1 --> 
     <Slider Name="OverlayOpacity" Height="25" Grid.Column="1" Margin="6,0,0,0" Grid.Row="1" Maximum="1" LargeChange="0.1" ValueChanged="OverlayOpacity_ValueChanged"/> 
     <TextBlock x:Name="OverlayName" Text="{Binding Path=LocationName}" Foreground="#FFF08D2D" Margin="10,2,0,0" Grid.Column="1" FontSize="12" Height="18" VerticalAlignment="Top" /> 

     <!-- Column 3 --> 
     <Button Name="SettingsButton" Grid.Column="3" Content="{Binding TRK_OV_Settings, Source={StaticResource translatorString}}" VerticalAlignment="Center" Click="SettingsButton_Click" /> 
     <CheckBox x:Name="OverlayEnabled" FlowDirection="LeftToRight" Grid.Column="2" DataContext="{Binding}" HorizontalAlignment="Right" VerticalAlignment="Center" Grid.RowSpan="2" Checked="OverlayEnabled_Checked" Unchecked="OverlayEnabled_Unchecked" /> 
     <TextBlock Name="percentage" Text="100%" FontSize="9" TextAlignment="Right" Grid.Column="2" Grid.Row="1" VerticalAlignment="Center" Margin="2,6,26,6" MinWidth="30"/> 
    </Grid> 
</Border> 

Encore une fois, il semble que mon UserControl est correctement capable de s'échelle juste pas obtenir la commande pour le faire lorsque le conteneur parent est redimensionné.

EDIT: Oups, supprimé la balise WPF car elle a été ajoutée de manière incorrecte. Je pense que je suis descendu au slider étant le coupable. Si je mets le curseur à une taille fixe au lieu de 'étirer', alors l'objet s'adapte correctement. La question est maintenant de savoir comment forcer le curseur à se redimensionner.

EDIT2: Je sais ce qui cause le problème mais je ne sais pas comment le résoudre. Qu'est-ce qui se passe est le curseur que j'ai dans mon contrôle utilisateur ne sera pas redimensionner avec le reste du contrôle à moins que je change la valeur du curseur pendant le redimensionnement. L'instant je change sa valeur même une fraction elle se redimensionne automatiquement. Comment puis-je le forcer à redimensionner?

+0

Supprime le code derrière. WPF n'a pas besoin de ça. Publiez le code XAML complet de UserControl. Utilisez Snoop pour inspecter l'arborescence visuelle lors de l'exécution et voir ce qui se passe. WPF est indépendant de la résolution, il ne nécessite pas de hacks par code. –

Répondre

0

J'ai déterminé que le curseur était à l'origine du problème et j'ai essayé de plusieurs façons de forcer le curseur à redessiner quand il le fallait mais je n'ai pas réussi. Ma solution finale consistait à retirer complètement le curseur. Fonctionne bien maintenant.

Questions connexes