WPF SOME STYLES NOT APPLIED ON DATATEMPLATE CONTROLS

Brad Pitt

Total Post:61

Points:429
Posted by  Brad Pitt
WPF 
WPF
 1454  View(s)
Ratings:
Rate this:
Hi Developers!

I am trying to learn something about WPF and I am quite amazed by its flexibility. 

However, I have hit a problem with Styles and DataTemplates, which is little bit confusing. I have defined below test page to play around a bit with styles etc and found that the Styles defined in <Page.Resources> for Border and TextBlock are not applied in the DataTemplate, but Style for ProgressBar defined in exactly the same way is applied. 

Source code (I just use Kaxaml and XamlPadX to view the result) 

<Page

  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 

  <Page.Resources> 

    <Style TargetType="{x:Type Border}">

      <Setter Property="Background" Value="SkyBlue"/>

      <Setter Property="BorderBrush" Value="Black"/>

      <Setter Property="BorderThickness" Value="2"/>

      <Setter Property="CornerRadius" Value="5"/>

    </Style> 

    <Style TargetType="{x:Type TextBlock}">

      <Setter Property="FontWeight" Value="Bold"/>

    </Style> 

    <Style TargetType="{x:Type ProgressBar}">

      <Setter Property="Height" Value="10"/>

      <Setter Property="Width" Value="100"/>

      <Setter Property="Foreground" Value="Red"/>

    </Style> 

    <XmlDataProvider x:Key="TestData" XPath="/TestData">

      <x:XData>

        <TestData xmlns="">

          <TestElement>

            <Name>Item 1</Name>

            <Value>25</Value>

          </TestElement>

          <TestElement>

            <Name>Item 2</Name>

            <Value>50</Value>

          </TestElement>

        </TestData>

      </x:XData>

    </XmlDataProvider> 

    <HierarchicalDataTemplate DataType="TestElement">

      <Border Height="45" Width="120" Margin="5,5">

        <StackPanel Orientation="Vertical" Margin="5,5" VerticalAlignment="Center" HorizontalAlignment="Center">

          <TextBlock HorizontalAlignment="Center" Text="{Binding XPath=Name}"/>

          <ProgressBar Value="{Binding XPath=Value}"/>

        </StackPanel>

      </Border>

    </HierarchicalDataTemplate> 

  </Page.Resources> 

  <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center">

    <StackPanel Orientation="Vertical" VerticalAlignment="Center">

      <Border Height="45" Width="120" Margin="5,5">

        <StackPanel Orientation="Vertical" VerticalAlignment="Center" HorizontalAlignment="Center">

          <TextBlock HorizontalAlignment="Center" Text="Item 1"/>

          <ProgressBar Value="25"/>

        </StackPanel>

      </Border>

      <Border Height="45" Width="120" Margin="5,5">

        <StackPanel Orientation="Vertical" VerticalAlignment="Center" HorizontalAlignment="Center">

          <TextBlock HorizontalAlignment="Center" Text="Item 2"/>

          <ProgressBar Value="50"/>

        </StackPanel>

      </Border>

    </StackPanel>

    <ListBox Margin="10,10"  Width="140" ItemsSource="{Binding Source={StaticResource TestData}, XPath=TestElement}"/>

  </StackPanel>

</Page> 

I suspect it has something to do with default styles etc, but more puzzling is why some Styles are applied and some not. I cannot find an easy explanation for above anywhere and thus would like to ask if someone would be kind enough to explain this behaviour in lamens' terms with possible links to technical description, i.e. to MSDN or so. 

Thanks in advance for you support!


  1. shreesh chandra shukla

    Post:105

    Points:735
    Re: WPF Some styles not applied on DataTemplate controls

    Hi!

    I've looked into this also, and I personally think it's a bug. I've noticed that the style is set if you name your styles like so:

    <Style x:Key="BorderStyle" TargetType="{x:Type Border}">

    etc... 

    and explicitly set your DataTemplate to use those styles: 

    <HierarchicalDataTemplate DataTemplate="TestElement">

      <Border Height="45" Width="120" Margin="5,5", Style="{StaticResource BorderStyle}"> 

    I think that it's possible that for DataTemplates (and maybe ControlTemplates), they default to having a null style, unless you explicitly set them. 

    That to me is not meant to happen - it's not a logical way of WPF working...

Answer

NEWSLETTER

Enter your email address here always to be updated. We promise not to spam!