Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to pass properties to WPF Style

Tags:

wpf

I'm trying to write a reusable Template for a WPF ItemContainerStyle.

This Template changes the way the TabControl's Item looks. This template is meant to be used in several places in the application.

In each place it is used I want to be able to pass different parameters to it. For example: to change the Margin of the Border of the Item:

    <Style x:Key="TabItemStyle1" TargetType="{x:Type TabItem}">

                <Setter Property="Margin" Value="10,0"/>

                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type TabItem}">
                            <Grid SnapsToDevicePixels="true">
                                <Border x:Name="Bd" Width="80"  
                                  Background="Gray" 
                                   Margin="{TemplateBinding Margin}">
                                    <ContentPresenter x:Name="Content" 
                                        ContentSource="Header" />
                                </Border>
                            </Grid>
                            <ControlTemplate.Triggers>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
...
<TabControl ItemContainerStyle="{DynamicResource TabItemStyle1}">

In the place where the style is used I Would like to Write something like:

ItemContainerStyle="{DynamicResource TabItemStyle1 Margin='5,0'}"

or

<TabControl Margin="78,51,167,90" ItemContainerStyle="{DynamicResource TabItemStyle1}"
            ItemContainerStyle.Margin="5,0">

The motivation is to use this template in different places with different Margins. Is there a way to do this ?

Thank you

like image 972
Tal Segal Avatar asked Oct 24 '25 11:10

Tal Segal


2 Answers

You can do it with attached properties. I wrote a blog post explaining how to do it:

http://www.thomaslevesque.com/2011/10/01/wpf-creating-parameterized-styles-with-attached-properties/

Another option is to use DynamicResource, and redefine the resource in derived styles

like image 72
Thomas Levesque Avatar answered Oct 26 '25 06:10

Thomas Levesque


OK, I've found a way to do this with dave's help.

The Solution is to create a derived template and set the properties in it. This way the original template can be reused.

<Style x:Key="TabItemStyle2" TargetType="{x:Type TabItem}" 
    BasedOn="{StaticResource TabItemStyle1}">
    <Style.Setters>
        <Setter Property="Margin" Value="40,0"></Setter>
    </Style.Setters>
</Style>

And set the TabControl's ItemContainerStyle to the derived style:

<TabControl ItemContainerStyle="{DynamicResource TabItemStyle2}">
like image 37
Tal Segal Avatar answered Oct 26 '25 05:10

Tal Segal



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!