none
ViewBox avec scaling sélectif. RRS feed

  • Question

  • Bonjour,

    Je travaille actuellement sur un projet WPF mettant en jeu une zone de travail où l'on peut dropper des objets et les redimensionner. J'utilise une ViewBox afin d'adapter la taille de la zone de travail ET des objets compris dans cette zone de travail (lors du redimensionnement de la fenêtre, mais aussi lors du changement d'image de fond de ma zone de travail).

    Mon problème est que dans ma ViewBox, j'aimerai que mes objets se redimensionnent (chose faite), mais que les éléments graphiques de redimensionnement conservent une taille fixée sur les pixels de l'écran (valeur absolue).

    Pour illustrer le problème : voici deux situations (1 et 2) représentant à gauche une fenêtre de petite taille et à droite lorsque la zone de travail (donc la ViewBox) occupe une grande surface (fenêtre en plein écran) : On voit bien sur la situation 1 (situation qui pose problème) que la taille de l’Ellipse permettant le redimensionnement de mes objets, change. Sur la situation 2, la taille est constante ce qui rend d’autant plus agréable le redimensionnement pour l’utilisateur.

    (image : xavier.malparty.fr/ViewBox.png )


    Ma question est donc de savoir s’il est possible d’avoir des éléments contenus dans une viewbox qui font exception au scaling imposé par la viewbox, mais qui dont les coordonnées restent relatives à la ViewBox.

    Sur d’autres forums, j’ai trouvé une éventuelle solution qui consisterait à remplacer ma viewBox par une grid et d’utiliser un converter pour adapter toutes les coordonnées et simuler le fonctionnement de la viewbox pour les paramètres qui en ont besoins. Mais je trouve cette solution assez fastidieuse à implémenter… Toute autre proposition est donc bienvenue ! 


    Pour le code : voice l’implémentation de ma viewBox. 
    Code :Sélectionner tout - Visualiser dans une fenêtre à part

    <Grid x:Name="dropZoneContainer" Background="{StaticResource DropZoneBackgroundBrush}" PreviewMouseDown="dropZoneContainer_PreviewMouseDown">
    	<!--Grid.Column="1"-->
    	<Viewbox x:Name="viewBox" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
    			ClipToBounds="False">
    
    		<!--Ce contrôle définit la zone maximale ou peuvent être déplacés les éléments.-->
    		<controls:MovingThumContainerBound>
    			<!--Deselect lorsque l'on ne clique pas sur un élément-->
    			<!--<i:Interaction.Triggers>
    					<i:EventTrigger EventName="MouseLeftButtonDown">
    						<ei:ChangePropertyAction PropertyName="SelectedItemInCanvas" TargetObject="{Binding .}"
    							Value="{x:Null}" />
    						</i:EventTrigger>
    					</i:Interaction.Triggers>-->
    
    			<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="Transparent">
    				<Image x:Name="imgBackgroundImage" Source="{Binding SelectedTerrain.ImagePath}"
    						IsHitTestVisible="False" />
    
    				<ListBox x:Name="_itemContainer" ItemsSource="{Binding ItemsInCanvas}"
    						Visibility="{Binding SelectedTerrain, ConverterParameter=True, Converter={StaticResource IsNullToVisibilityConverter}}"
    						SelectedItem="{Binding SelectedItemInCanvas, Mode=TwoWay}" HorizontalAlignment="Stretch"
    						AllowDrop="True" Background="Transparent" VerticalAlignment="Stretch"
    						ClipToBounds="False" SelectionMode="Single"
    						ItemContainerStyleSelector="{StaticResource ItemInCanvasContainerStyleSelector}"
    						BorderBrush="{x:Null}" Style="{StaticResource ItemContainerListBoxStyle}"                                
    						PreviewDrop="ItemsControl_Drop_1">
    
    					<!--TODO DROP BEHAVIOR-->
    
    					<!--<i:Interaction.Triggers>
    							<i:EventTrigger EventName="Drop">
    								<ei:CallMethodAction MethodName="ItemDropped" />
    							</i:EventTrigger>
    						</i:Interaction.Triggers>-->
    
    					<ListBox.ItemsPanel>
    						<ItemsPanelTemplate>
    							<Canvas  SnapsToDevicePixels="True" IsItemsHost="True" ClipToBounds="False" />
    						</ItemsPanelTemplate>
    					</ListBox.ItemsPanel>
    
    				</ListBox>
    			</Grid>
    		</controls:MovingThumContainerBound>
    	</Viewbox>
    	<Canvas x:Name="_selectionCanvas"/>
    </Grid>


    Les éléments de redimensionnement sont inclus par ResourceDictionary
    selon le type d’item dans ma liste box :
    Code :Sélectionner tout - Visualiser dans une fenêtre à part

    <Style TargetType="{x:Type Shape}" x:Key="ResizeRotateThumbCorner">
        <Setter Property="SnapsToDevicePixels" Value="true" />
        <Setter Property="Stroke" Value="Black" />
        <Setter Property="StrokeThickness" Value="1" />
        <Setter Property="Width" Value="8" />
        <Setter Property="Height" Value="8" />
        <Setter Property="Margin" Value="-2" />
        <Setter Property="Fill" Value="{StaticResource ResizeRotateThumbCornerFillBrush}" />
    </Style>


    Merci d'avance pour une piste ! 

    Xavier

    • Déplacé Aurel Bera mercredi 7 novembre 2012 08:56 (Origine :Visual C#)
    • Type modifié Aurel Bera jeudi 15 novembre 2012 10:48 Pas de reponse
    • Type modifié Aurel Bera mardi 20 novembre 2012 09:13 Resolu
    mardi 6 novembre 2012 09:28

Réponses

  • Bonjour,

    J'ai finalement implémenté une solution alternative : www.developpez.net/forums/d1276526/dotnet/developpement-windows/windows-presentation-foundation/scaling-selectif-viewbox/#post6965348

    ça a nécessité beaucoup de changement car j'avais pas mal de code lié à ça ; mais globalement, ça répond concrètement à mon problème ;)


    Cordialement,

    Xavier

    • Marqué comme réponse Aurel Bera mardi 20 novembre 2012 09:14
    mardi 20 novembre 2012 09:11

Toutes les réponses