dessin WPF qui étend sans étirer le Pen

voix
6

Je dois tirer quelques lignes simples dans un contrôle des frontières (ou similaire) qui s'étendent toujours aux limites de la frontière. Est-il possible d'étirer les lignes seulement, mais pas son stylo? Sans impliquer beaucoup de C #?

Dans cette version, les lignes étirent:

<Border>
   <Border.Background>
      <DrawingBrush>
         <DrawingBrush.Drawing>
            <DrawingGroup>
               <GeometryDrawing Brush=Red>
                  <GeometryDrawing.Geometry>
                     <GeometryGroup>
                        <RectangleGeometry Rect=0,0 100,1000 />
                        <LineGeometry  StartPoint=0,0 EndPoint=100,1000/>
                        <LineGeometry  StartPoint=100,0 EndPoint=0,1000/>
                     </GeometryGroup>
                  </GeometryDrawing.Geometry>
                  <GeometryDrawing.Pen>
                     <Pen Thickness=20 Brush=Black/>
                  </GeometryDrawing.Pen>
               </GeometryDrawing>
            </DrawingGroup>
         </DrawingBrush.Drawing>
      </DrawingBrush>
   </Border.Background>
</Border>

La meilleure solution que je suis venu avec ceci:

<Border>
   <Grid>
      <Path Stretch=Fill Fill=Red Stroke=Black StrokeThickness=4  Data=M0,0 L100,0 100,1000 0,1000 z />
      <Path Stretch=Fill Stroke=Black StrokeThickness=4  Data=M 0,0 L0,0 100,1000 />
      <Path Stretch=Fill Stroke=Black StrokeThickness=4  Data=M 100,0 L100,0 0,1000 />
   </Grid>
</Border>

Mais est-il pas une meilleure solution? Cela n'implique pas la grille supplémentaire?

Créé 26/08/2009 à 22:18
source utilisateur
Dans d'autres langues...                            


3 réponses

voix
5

Je l'ai fait par mise à l'échelle des données, et non d'un chemin du composant visuel.

  1. Placez un chemin dans une toile.
  2. Set path.Data à une géométrie représentant vos données en pourcentage de la plage logique.
  3. Set path.Data.Transform à un ScaleTransform avec ScaleX et ScaleY lié à la largeur et la hauteur réelle.
Créé 06/12/2010 à 23:14
source utilisateur

voix
4

Au sein d'une ligne, vous pouvez lier la largeur (ou hauteur, selon la façon dont vous dessinez la ligne) à celle du conteneur parent pour obtenir ce que vous voulez.

    <Grid x:Name="Grid" Margin="10">
        <Border BorderBrush="Black" BorderThickness="1"  />
        <Line X1="0" X2="{Binding ElementName=Grid, Path=ActualWidth}" Y1="1" Y2="1" Stroke="Red" Margin="0,10,0,0" />
        <Line X1="0" X2="{Binding ElementName=Grid, Path=ActualWidth}" Y1="1" Y2="1" Stroke="Green" Margin="0,30,0,0" />
        <Line X1="0" X2="{Binding ElementName=Grid, Path=ActualWidth}" Y1="1" Y2="1" Stroke="Blue" Margin="0,50,0,0" />
    </Grid>

Edit: Voici une autre façon sans utiliser la liaison

<Border BorderBrush="Black" BorderThickness="1" >
    <Path Stroke="Red" StrokeThickness="1" Data="M0,0 1,0Z" Stretch="Fill" />
</Border>
Créé 26/08/2009 à 22:33
source utilisateur

voix
1

Pas que je sache. Mais à moins que vous faites quelque chose de vraiment extravagant, il est vraiment pas beaucoup d'efforts pour passer outre OnRenderet d'en tirer vous - même:

public class CustomBorder : Border
{
    protected override void OnRender(DrawingContext dc)
    {
        base.OnRender(dc);

        dc.DrawLine(new Pen(BorderBrush, BorderThickness.Top), new Point(0, 0), new Point(ActualWidth, ActualHeight));
    }
}

Résultat:

entrez la description d'image ici

Créé 26/08/2009 à 22:25
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more