Style content via setters v ContentTemplate
Your Content
property is set to a DataTemplate
DataTemplates
are meant to be used with Template
properties, and not directly inserted into the VisualTree via the Content
property
Change your Style Setter to set the ContentTemplate
instead of Content
and it should work fine
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<TextBlock Text="a" FontFamily="Wingdings 3" FontWeight="Bold" FontSize="18" Foreground="Navy" />
</DataTemplate>
</Setter.Value>
</Setter>
As for your second question, I prefer the first because its simpler, and I think it may contain fewer elements in the Visual Tree (I'd have to double-check that)
Berryl
Updated on June 17, 2022Comments
-
Berryl almost 2 years
The xaml for the first style works as I want, producing a button with a Wingding glyph using setters to lay out the content and it's properties. The second version of this style is trying to do the same thing but with a DataTemplate for the Content, but it just displays the type of a DataTemplate (ie, System.Windows.DataTemplate).
- Why won't the 2nd version display the same content as the 1st?
- Assuming the fix is trivial, would one version of the style be preferable over the other for any reason beyond personal preference?
NOTE: I am showing the bindings and triggers in case there is something in there that is affecting the content, but it's only the the first part of the style that varies
Cheers,
BerrylStyle 1
Displays:
<Style x:Key="EditCommandButtonStyle" TargetType="{x:Type Button}" > <Setter Property="Content" Value="a" /> <Setter Property="Foreground" Value="Navy" /> <Setter Property="FontFamily" Value="Wingdings 3" /> <Setter Property="FontWeight" Value="Bold" /> <Setter Property="FontSize" Value="18" /> <Setter Property="Width" Value="30" /> <Setter Property="Height" Value="Auto" /> <!--What makes it an Edit button--> <Setter Property="Command" Value="{Binding ActivateThisSatelliteVmCommand}"/> <Setter Property="ToolTip"> <Setter.Value> <TextBlock> <TextBlock.Text> <Binding Path="HeaderLabel" StringFormat="{resx:Resx ResxName=Smack.Core.Presentation.Resources.MasterDetail, Key=Item_Edit_Label}"/> </TextBlock.Text> </TextBlock> </Setter.Value> </Setter> <!-- WHen its available --> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type Button}"> <Border x:Name="theBorder" CornerRadius="4"> <ContentPresenter x:Name="theContent" VerticalAlignment="Center" HorizontalAlignment="Center" /> </Border> <ControlTemplate.Triggers> <Trigger Property="IsMouseOver" Value="False"> <Setter TargetName="theContent" Property="Visibility" Value="Hidden"/> <Setter TargetName="theBorder" Property="Background" Value="Transparent"/> </Trigger> <Trigger Property="IsMouseOver" Value="True"> <Setter TargetName="theContent" Property="Visibility" Value="Visible"/> </Trigger> <Trigger Property="IsPressed" Value="True"> <Setter TargetName="theContent" Property="Visibility" Value="Visible"/> <Setter TargetName="theBorder" Property="Background" Value="Orange"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style>
Style 2
Displays "System.Windows.DataTemplate"
<Style x:Key="EditCommandButtonStyle" TargetType="{x:Type Button}" > <Setter Property="Content"> <Setter.Value> <DataTemplate> <TextBlock Text="a" FontFamily="Wingdings 3" FontWeight="Bold" FontSize="18" Foreground="Navy" /> </DataTemplate> </Setter.Value> </Setter> <!--What makes it an Edit button--> <Setter Property="Command" Value="{Binding ActivateThisSatelliteVmCommand}"/> <Setter Property="ToolTip"> <Setter.Value> <TextBlock> <TextBlock.Text> <Binding Path="HeaderLabel" StringFormat="{resx:Resx ResxName=Core.Presentation.Resources.MasterDetail, Key=Item_Edit_Label}"/> </TextBlock.Text> </TextBlock> </Setter.Value> </Setter> <!-- When its available --> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type Button}"> <Border x:Name="theBorder" CornerRadius="4"> <ContentPresenter x:Name="theContent" VerticalAlignment="Center" HorizontalAlignment="Center" /> </Border> <ControlTemplate.Triggers> <Trigger Property="IsMouseOver" Value="False"> <Setter TargetName="theContent" Property="Visibility" Value="Hidden"/> <Setter TargetName="theBorder" Property="Background" Value="Transparent"/> </Trigger> <Trigger Property="IsMouseOver" Value="True"> <Setter TargetName="theContent" Property="Visibility" Value="Visible"/> </Trigger> <Trigger Property="IsPressed" Value="True"> <Setter TargetName="theContent" Property="Visibility" Value="Visible"/> <Setter TargetName="theBorder" Property="Background" Value="Orange"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style>
-
Berryl almost 12 yearsBingo, unsurprisingly. It confirms my suspicion that the WPF learning curve is surrprisingly steep when there is only a tiny handful of people that consistently have the answers to what should be mundane questions. Cheers
-
jeromej almost 4 yearsI also add to use a
<ContentPresenter />
in my parent template instead of<ContentControl Content="{TemplateBinding Content}" />
for it to work but now I can't override the content in the view anymore. Making it not a overridable default value. (which was my initial goal)