91 votes

Comment puis-je obtenir une bordure en pointillés ou en tirets dans WPF ?

J'ai un ListViewItem que j'applique un Style et j'aimerais mettre une ligne grise en pointillés en bas de l'écran. Border .

Comment puis-je faire cela dans WPF ? Je ne vois que des brosses de couleur unie.

0 votes

Avez-vous vérifié ceci stackoverflow.com/questions/1630022/

1 votes

Non - Merci pour ça. Vous ne connaissez pas de simple de la manière dont vous le faites ? Ça ressemble à un piratage.

0 votes

Article connexe, et probablement la meilleure réponse stackoverflow.com/questions/14936002/

127voto

Rand Scullard Points 373

Cela a très bien fonctionné dans notre application, nous permettant d'utiliser une vraie bordure et de ne pas nous embêter avec des rectangles :

<Border BorderThickness="1,0,1,1">
   <Border.BorderBrush>
      <DrawingBrush Viewport="0,0,8,8" ViewportUnits="Absolute" TileMode="Tile">
         <DrawingBrush.Drawing>
            <DrawingGroup>
               <GeometryDrawing Brush="Black">
                  <GeometryDrawing.Geometry>
                     <GeometryGroup>
                        <RectangleGeometry Rect="0,0,50,50" />
                        <RectangleGeometry Rect="50,50,50,50" />
                     </GeometryGroup>
                  </GeometryDrawing.Geometry>
               </GeometryDrawing>
            </DrawingGroup>
         </DrawingBrush.Drawing>
      </DrawingBrush>
   </Border.BorderBrush>

   <TextBlock Text="Content Goes Here!" Margin="5"/>
</Border>

Notez que la fenêtre d'affichage détermine la taille des tirets dans les lignes. Dans ce cas, elle génère des tirets de huit pixels. Viewport="0,0,4,4" vous donnerait des tirets de quatre pixels.

0 votes

Comment peut-on l'utiliser sur d'autres éléments qui ont besoin du même style ?

0 votes

Vous pouvez définir un style qui inclut le DrawingBrush, puis appliquer ce style aux éléments que vous souhaitez.

0 votes

Les deux rectangles sont en fait alignés de telle sorte que ce motif fonctionne tout autour de la frontière, horizontalement et verticalement, à gauche et à droite. (Il vaut mieux ne pas essayer de l'utiliser pour des lignes non-rectangulaires cependant...)

107voto

biju Points 7193

Vous pouvez créer une ligne en pointillés ou en tirets en utilisant un rectangle comme dans le code ci-dessous

<Rectangle Stroke="#FF000000" Height="1" StrokeThickness="1" StrokeDashArray="4 4"
                                                       SnapsToDevicePixels="True"/>

Commencez par cela et personnalisez votre listview en fonction de votre scénario.

2 votes

Y a-t-il un moyen de faire ça avec des coins arrondis ?

10 votes

@Jordan Use RadiusX="10" RadiusY="10" .

40voto

dotNET Points 5290

J'arrive un peu tard, mais la solution suivante a fonctionné pour moi. Elle est légèrement plus simple/meilleure que les deux autres solutions :

<Border BorderThickness="1">
  <Border.BorderBrush>
    <VisualBrush>
      <VisualBrush.Visual>
        <Rectangle StrokeDashArray="4 2" Stroke="Gray" StrokeThickness="1"
                  Width="{Binding RelativeSource={RelativeSource AncestorType={x:Type Border}}, Path=ActualWidth}"
                  Height="{Binding RelativeSource={RelativeSource AncestorType={x:Type Border}}, Path=ActualHeight}"/>
      </VisualBrush.Visual>
    </VisualBrush>
  </Border.BorderBrush>

  <TextBlock Text="Whatever" />
</Border>

6voto

Dreia Ria Points 41

Xaml

<Grid>
<Grid.RowDefinitions><RowDefinition Height="auto"/></Grid.RowDefinitions>
<Grid.ColumnDefinitions><ColumnDefinition Width="auto"/></Grid.ColumnDefinitions>
<Rectangle RadiusX="9" RadiusY="9" Fill="White" Stroke="Black" StrokeDashArray="1,2"/>
<TextBlock Padding = "4,2" Text="Whatever"/>
</Grid>

0voto

Galactic Points 56

Travail sur un contrôle d'utilisateur.... J'ai essayé un storyboard pour une bordure de fourmis marchantes. La grille de base avec un rectangle et du texte fonctionne bien puisqu'il n'y a pas d'interaction. Lorsque j'essaie de placer un bouton à l'intérieur de la grille, soit le rectangle, soit le bouton est visible, mais jamais les deux.

D'un autre poste : Effets d'animation XAML avancés. Impulsion, fourmis marchantes, rotations. Alertes

L'utilisation de la solution de dotNet pour le VisualBrush a déplacé le rectangle vers la bordure avec un bouton à l'intérieur. Cela a parfaitement fonctionné.

<UserControl.Resources>
    <ResourceDictionary>
        <Style TargetType="{x:Type TextBlock}" x:Key="LOC_DG_Cell_Mid" BasedOn="{StaticResource DG_TextBlock_Mid}" >
            <Setter Property="Margin" Value="5 0"/>
        </Style>
        <Storyboard x:Key="MarchingAnts">
            <DoubleAnimation BeginTime="00:00:00"
                Storyboard.TargetName="AlertBox"                                
                Storyboard.TargetProperty="StrokeThickness"
                To="4"
                Duration="0:0:0.25" />
            <!-- If you want to run counter-clockwise, just swap the 'From' and 'To' values. -->
            <DoubleAnimation BeginTime="00:00:00" RepeatBehavior="Forever" Storyboard.TargetName="AlertBox" Storyboard.TargetProperty="StrokeDashOffset" 
                            Duration="0:3:0" From="1000" To="0"/>
        </Storyboard>
    </ResourceDictionary>

</UserControl.Resources>
<UserControl.Triggers>
    <EventTrigger RoutedEvent="FrameworkElement.Loaded">
        <BeginStoryboard Storyboard="{StaticResource MarchingAnts}"/>
    </EventTrigger>
</UserControl.Triggers>

<Grid>
    <Border BorderThickness="1">
        <Border.BorderBrush>
            <VisualBrush>
                <VisualBrush.Visual>
                    <Rectangle x:Name="AlertBox" Stroke="Red" StrokeDashOffset="2" StrokeDashArray="5" Margin="5"
                      Width="{Binding RelativeSource={RelativeSource AncestorType={x:Type Border}}, Path=ActualWidth}"
                      Height="{Binding RelativeSource={RelativeSource AncestorType={x:Type Border}}, Path=ActualHeight}"/>
                </VisualBrush.Visual>
            </VisualBrush>
        </Border.BorderBrush>

        <Button x:Name="FinishedButton" Padding="0 5" Margin="0" Style="{StaticResource IconButton}" >
            <StackPanel Orientation="Horizontal" >
                <Label Style="{StaticResource ButtonLabel}" Content="Processing has Finished" />
            </StackPanel>
        </Button>
    </Border>
</Grid>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X