2009-11-25 14 views
30

Utworzono statyczny zasób definiujący obramowanie określonego elementu w moim pliku xaml, ale nie mogę znaleźć dobrego sposobu na określenie unikalnego koloru dla każdej strony!Styl obramowania z innym kolorem pędzla dla każdego rogu

XAML:

<Border Style="{StaticResource SidePanelBorder}"> 
     <!-- rest of the xaml --> 
</Border> 

StaticResource:

<Style x:Key="SidePanelBorder"> 
    <Setter Property="Control.BorderBrush" Value="#FF363636" /> 
    <Setter Property="Control.BorderThickness" Value="1" /> 
</Style> 

Ale chcę, aby zdefiniować jeden kolor dla każdej stronie granicy, a ostatecznie także inną grubość obramowania.

Jakieś dobre techniki robiące to?

+0

Chcę stworzyć efekt wstawki przy użyciu granicy –

Odpowiedz

49

wydaje się bardzo hacky, ale można określić granice w obrębie granic i zrobić tylko 1 strona posiada grubość. Na przykład:

<Border BorderThickness="0,0,0,10" BorderBrush="Green"> 
    <Border BorderThickness="0,0,10,0" BorderBrush="Blue"> 
     <Grid> 
      <Button>Hello</Button> 
     </Grid> 
    </Border> 
</Border> 

dałoby zielone obramowanie na dole i niebieskie obramowanie po prawej stronie. Nie jest jednak najładniejszym kawałkiem Xaml.

+0

To jest dokładnie to, co znalazłem jako najlepsze rozwiązanie dla siebie. Nie powinno być potrzeby wprowadzania 2 granic dla czegoś tak prostego jak to, ale myślę, że będę musiał pójść na twoje rozwiązanie! Dzięki –

+5

Czy to działa z zaokrąglonymi rogami? – eriksmith200

2

nie ma łatwy sposób to zrobić bez pisania własnych kontroli lub instacji granicę

+5

Hmm, to wstyd! Powinno być tak proste, jak w html i css, gdzie masz border-top, border-right i tak dalej! –

9

możesz mieć DockPanel i umieścić w nim 4 obramowania, z których każda jest umieszczona na innej stronie. jak:

<DockPanel LastChildFill="true"> 
    <Border DockPanel.Dock="Left" Background="Red"/> 
    <Border DockPanel.Dock="Top" Background ="Blue"/> 
    <Border DockPanel.Dock="Right" Background ="Yellow"/> 
    <Border DockPanel.Dock="Bottom" Background ="Green"/> 
    <Grid> 
    ...........your control here 
    </Grid> 
</DockPanel> 
+2

Interesujące podejście. – Tower

4

Jeśli używasz siatki można mieć nakładkę na granicy za sobą, aby osiągnąć ten sam efekt. Wystarczy ustawić grubość obramowania koloru obramowania, które chcesz pokazać i mieć drugą grubość obramowania być 0.

<UserControl.Resources> 
     <Style x:Key="GreenBorder" TargetType="Border"> 
      <Setter Property="BorderBrush" Value="Green" /> 
      <Setter Property="BorderThickness" Value="1,1,1,0" />   
     </Style> 
     <Style x:Key="RedBorder" TargetType="Border"> 
      <Setter Property="BorderBrush" Value="Red" /> 
      <Setter Property="BorderThickness" Value="0,0,0,1" /> 
     </Style> 
    </UserControl.Resources> 

    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="Auto" /> 
      <ColumnDefinition Width="*" /> 
     </Grid.ColumnDefinitions> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="Auto" /> 
     </Grid.RowDefinitions> 
     <Border Grid.Column="0" Grid.Row="0" Style="{StaticResource GreenBorder}"> 
      <!-- Content goes here --> 
     </Border> 
     <Border Grid.Column="0" Grid.Row="0" Style="{StaticResource RedBorder}"> 
     </Border> 
    </Grid> 

To daje zieloną granicę z lewej i prawej, górnej granicy, ale czerwoną obwódką do dolna granica komórki siatki.

20

Innym rozwiązaniem stosując jedną granicę i VisualBrush, umożliwiając ustawienie granicy za CornerRadius i BorderThickness:

<Border BorderThickness="10" CornerRadius="10" HorizontalAlignment="Right" Height="150" VerticalAlignment="Bottom" Width="150" Margin="0,0,92.666,42.667"> 
    <Border.BorderBrush> 
     <VisualBrush> 
      <VisualBrush.Visual> 
       <Grid> 
        <Grid.RowDefinitions> 
         <RowDefinition/> 
         <RowDefinition/> 
        </Grid.RowDefinitions> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition/> 
         <ColumnDefinition/> 
        </Grid.ColumnDefinitions> 

        <Path x:Name="ColoredBorderLeft" Data="M0,0 L0,0 1,0.5 L1,0.5 0,1" Fill="Blue" Stretch="Fill" Grid.RowSpan="2"/> 
        <Path x:Name="ColoredBorderRight" Data="M1,0 L1,0 0,0.5 L0,0.5 1,1" Fill="Red" Stretch="Fill" Grid.Column="1" Grid.RowSpan="2"/> 
        <Path x:Name="ColoredBorderTop" Data="M0,0 L0,0 0.5,1 L0.5,1 1,0" Fill="Green" Stretch="Fill" Grid.ColumnSpan="2"/> 
        <Path x:Name="ColoredBorderBottom" Data="M0,1 L0,1 0.5,0 L0.5,0 1,1" Fill="Yellow" Stretch="Fill" Grid.Row="1" Grid.ColumnSpan="2"/> 
       </Grid> 
      </VisualBrush.Visual> 
     </VisualBrush> 
    </Border.BorderBrush> 
</Border> 
  • Siatka jest potrzebna, aby zapobiec wskazówki ścieżek trójkąt „przepchnąć” do granicy .
  • Nazwy Path.Name można użyć do DataBinding lub ustawienia koloru z kodu z tyłu.
+0

Bardzo ładne i działa z zaokrąglonymi narożnikami –

Powiązane problemy