desenho WPF que se estende sem esticar a Pen

votos
6

Preciso para desenhar algumas linhas simples dentro de um controlo de fronteira (ou semelhante) que sempre esticar para os limites da fronteira. Existe uma maneira de esticar as linhas apenas, mas não a sua caneta? Sem que envolve lotes do C #?

Nesta versão as linhas esticar:

<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>

A melhor solução que eu vim com é esta:

<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>

Mas não há uma solução melhor? Que não envolve grade extra?

Publicado 26/08/2009 em 22:18
fonte usuário
Em outras línguas...                            


3 respostas

votos
5

Eu fiz isso através do escalonamento de dados de um caminho, não o componente visual.

  1. Coloque um trajeto em uma lona.
  2. Definir path.Data a uma geometria que representa seus dados como percentagens da faixa de lógica.
  3. Definir path.Data.Transform para um ScaleTransform com ScaleX e ScaleY ligado à largura e altura real.
Respondeu 06/12/2010 em 23:14
fonte usuário

votos
4

Dentro de uma linha, você pode vincular a largura (ou altura, dependendo da maneira que você está desenhando a linha) ao do recipiente pai para conseguir o que deseja.

    <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: Aqui é uma outra maneira sem o uso de ligação

<Border BorderBrush="Black" BorderThickness="1" >
    <Path Stroke="Red" StrokeThickness="1" Data="M0,0 1,0Z" Stretch="Fill" />
</Border>
Respondeu 26/08/2009 em 22:33
fonte usuário

votos
1

Nenhum que eu saiba. Mas a menos que você está fazendo algo realmente extravagante, ele realmente não é um grande esforço para substituir OnRendere desenhá-la a si mesmo:

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));
    }
}

Resultado:

digite descrição da imagem aqui

Respondeu 26/08/2009 em 22:25
fonte usuário

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