2009-09-23 14 views
9

Powiedzmy, że mam siatkę, w mojej sieci mam wiele elementów sterujących. Zamiast ustawiać margines dla każdego z tych elementów sterujących, chcę utworzyć styl, aby ustawić margines dla dowolnej kontroli, którą wpadnę do siatki. czy to możliwe?Stosowanie stylów WPF do elementów potomnych

miałem nadzieję, że będzie działać następujące:

<Window.Resources> 
    <Style x:Key="DefaultMargins"> 
     <Setter Property="Control.Margin" Value="3, 3, 3, 3"/> 
     <Setter Property="Control.FontSize" Value="50"/> 
    </Style> 
</Window.Resources> 
<Grid Style="{StaticResource DefaultMargins}"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="3*"/> 
     <ColumnDefinition Width="3*"/> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="3*"/> 
     <RowDefinition Height="3*"/> 
    </Grid.RowDefinitions> 
    <Button Grid.Row="0" Grid.Column="0" Name="button1">Button</Button> 
</Grid> 

Ale Margin jest ignorowany, nie wspierając wartości nieruchomości dziedziczenia. Czy istnieje prosta alternatywa do zastosowania marginesów dla każdego "dziecka" sieci? Rozumiem, że możliwe jest osiągnięcie tego rodzaju rzeczy w CSS, a niektórzy z naszych programistów są zainteresowani wykorzystaniem tego rodzaju konstrukcji.

Dzięki Ian

+0

Czy znalazłeś odpowiedź na to pytanie? Pytam, ponieważ mam ten sam problem. –

Odpowiedz

1

To wydaje się odpowiadać na podobne pytanie do Ciebie: Apply style to all TreeViewItem

Jeśli to nie poskutkuje, to nie jestem zbyt pewny o tym, jak to zrobić w XAML, ale ciebie można dodać styl w opóźnieniem kodu z:

Control element; 

for (int i = 0; i < Grid1.Children.Count; i++) 
{ 
    element = (Control) Grid1.Children[i]; 
    element.Style = (Style) FindResource("DefaultMargins"); 
} 

EDIT: Grid1 odnosi się do siekiery: Name = „Grid1” własność dodany do siatki XAML (biedny nazewnictwa wiem).

4

Można określić styl według typu i ograniczyć go do zakresu Grid:

<Grid> 
<Grid.Resources> 
    <Style TargetType="{x:Type Control}"> 
     <Setter Property="Control.Margin" Value="3, 3, 3, 3"/> 
     <Setter Property="Control.FontSize" Value="50"/> 
    </Style> 
</Grid.Resources> 
<Grid.ColumnDefinitions> 
    <ColumnDefinition Width="3*"/> 
    <ColumnDefinition Width="3*"/> 
</Grid.ColumnDefinitions> 
<Grid.RowDefinitions> 
    <RowDefinition Height="3*"/> 
    <RowDefinition Height="3*"/> 
</Grid.RowDefinitions> 
<Button Grid.Row="0" Grid.Column="0" Name="button1">Button</Button> 

+0

Będzie to jednak dotyczyć także dzieci dzieci i tak dalej. Zobacz moją odpowiedź poniżej dla dokładnego rozwiązania przy użyciu 'ItemsControl.ItemContainerStyle'. –

+0

Próbowałem Twojego kodu, ale nie mogłem go uruchomić. Po głębszym wykopaniu odkryłem, że WPF nie stosuje stylu do kontrolki, gdy właściwość TargetType tego stylu jest ustawiona na klasę bazową tej kontrolki. http://stackoverflow.com/questions/1026635/setting-a-styles-targettype-property-to-a-base-class – addy689

+0

To przyszło do skutku. Nie zamieszczam kodu, że nie karmię psem. – Jordan

0

elementami miejsce wewnątrz ItemsControl z ItemsPanel zestaw do Grid i ItemContainerStyle do stylu:

<Window.Resources> 
    <Style x:Key="DefaultMargins"> 
    <Setter Property="Control.Margin" 
      Value="3, 3, 3, 3" /> 
    <Setter Property="Control.FontSize" 
      Value="50" /> 
    </Style> 
</Window.Resources> 
<ItemsControl ItemContainerStyle="{StaticResource DefaultMargins}"> 
    <ItemsControl.ItemsPanel> 
    <ItemsPanelTemplate> 
     <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="3*" /> 
      <ColumnDefinition Width="3*" /> 
     </Grid.ColumnDefinitions> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="3*" /> 
      <RowDefinition Height="3*" /> 
     </Grid.RowDefinitions> 
     </Grid> 
    </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 

    <Button Grid.Row="0" 
      Grid.Column="0" 
      Name="button1">Button</Button> 

</ItemsControl> 

Ma to tę wadę, że nie działa dobrze w przypadku projektanta.

+0

wydaje się, że dokładnie to, czego szukałem. Jeśli wrócę później, wypróbuj go i zadziała, a potem przegłosuję. – Maslow

Powiązane problemy