2010-09-18 8 views
0

je crée le WPF suivant le contrôle d'un point et une étiquette de description: * North StarAutosize WPF contrôle

<UserControl x:Class="StopPoint.UserControl1" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     mc:Ignorable="d" 
     d:DesignHeight="300" d:DesignWidth="300"> 
    <Canvas> 
     <Path Fill="SkyBlue" Stroke="Black" StrokeThickness="2"> 
      <Path.Data> 
       <EllipseGeometry Center="10, 10" RadiusX="4" RadiusY="4"/> 
      </Path.Data> 
     </Path> 
     <TextBlock Text="North Star" Canvas.Left="20" Canvas.Top="20"/> 
    </Canvas> 
</UserControl> 

je vais avoir beaucoup d'étoiles dans le panneau. Puis-je auto-dimensionner le contrôle qui prend la taille minimale possible?

Quelque chose à la: <Window SizeToContent="WidthAndHeight">...</Window>?

+0

Largeur = "Auto" Hauteur = "Auto" – Sugrue

+0

@Sugrue quelle largeur? – serhio

+0

Sugrue

Répondre

1

Que diriez-vous de l'intégrer dans un simple panneau de pile?

<UserControl x:Class="StopPoint.UserControl1" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     mc:Ignorable="d" 
     d:DesignHeight="300" d:DesignWidth="300"> 

    <StackPanel Orientation="Horizontal"> 
     <Ellipse Margin="4" Stroke="Black" Fill="Yellow" Height="10" Width="10"/> 
     <TextBlock Text="North Star"> 
      <TextBlock.RenderTransform> 
       <RotateTransform Angle="45"/> 
      </TextBlock.RenderTransform> 
     </TextBlock> 
    </StackPanel> 
</UserControl> 
+0

Tout d'abord, le problème est que la position de l'étiquette soit personnalisée (rayon et angle de l'emplacement du texte), après que le contrôle utilisateur d: DesignHeight = "300" d: DesignWidth = "300" est aussi mauvais ... – serhio

+0

Le DesignHeight est juste pour la commodité dans le concepteur.Une fois que vous commencez à l'utiliser dans un autre contrôle ce n'est pas grave.J'ai ajouté un RotateTransform au TextBlock. – Holstebroe

+1

Si vous voulez utiliser une toile, vous pouvez l'intégrer dans une Viewbox pour contrôler son dimensionnement, mais cela ne vous donnera probablement pas la même chose. le calibrage automatique que vous voulez – Holstebroe

1

Le d: attributs DesignHeight/largeur ne sont respectés dans le concepteur, qui est soit le concepteurs Blend ou Visual Studio (cidre). Vous pouvez les supprimer en toute sécurité, puis vous verrez dans le concepteur votre contrôle sans aucune contrainte.

Le comportement de taille automatique que vous décrivez est la valeur par défaut pour de nombreux contrôles de conteneur. Essayez de ne pas utiliser une toile, comme Holstebroe suggéré. Essayez aussi de regarder les transformations à la place - vous pouvez appliquer une rotation et traduire des transformations pour obtenir les effets que vous décrivez.

0

Vous devez créer le comportement autosize dans votre usercontrol. La méthode WPF permet aux parents de demander aux éléments enfants l'espace dont ils ont besoin (mesure de la phase), puis de leur dire combien d'espace ils ont réellement (organiser la phase) en fonction de l'espace disponible.

Ici, vous voulez que la taille du parent soit dictée par l'espace requis pour les enfants. Donc lier la taille du parent de premier niveau (Canvas/UserControl) à l'espace requis pour le contenu - utiliser un IMultiValueConverter pour obtenir plusieurs entrées pour la sommation. Reportez-vous au lien que j'ai posté sur la création d'un usercontrol pour obtenir un texte centré dans une forme, qui est un exemple de ce qui précède.
Une fois que vous avez ceci, vous pouvez également faire un ajustement à l'écran en utilisant une Viewbox.

 <!-- 36 <= 20 (canvas.top) + 16 (textblock.actualheight) --> 
     <!--75 <= 20 (canvas.left) + 55 (textblock.actualwidth)--> 
     <Canvas Background="SkyBlue" Height="36" Width="75"> 
     <TextBlock Canvas.Left="25" Text="{Binding ElementName=label, Path=ActualHeight}"/> 
     <Path x:Name="dot" Fill="SkyBlue" Stroke="Black" StrokeThickness="2"> 
       <Path.Data> 
        <EllipseGeometry Center="10, 10" RadiusX="4" RadiusY="4"/> 
       </Path.Data> 
      </Path> 

     <TextBlock x:Name="label" Text="North Star" Canvas.Left="20" Canvas.Top="20"/>