Можно ли создать шаблон в WPF XAML? - PullRequest
2 голосов
/ 15 мая 2010

Можно ли использовать шаблоны внутри шаблонов?

Например, у меня есть два следующих шаблона:

<HierarchicalDataTemplate 
    x:Key="RecursiveTemplate"
    ItemsSource="{Binding Children}">
    <StackPanel Margin="1" Orientation="Horizontal">
        <Ellipse Fill="DarkGreen" Width="14" Height="14"/>
        <TextBlock 
            MouseDown="OnTreeMouseDown" 
            TargetUpdated="OnTargetUpdated"
            Visibility="{Binding Editing, Converter={StaticResource visibilityInverter}}" 
            Margin="5" 
            Text="{Binding Name}"/>
        <TextBox 
            PreviewKeyDown="OnTreeKeyDown" 
            Visibility="{Binding Editing, Converter={StaticResource visibilityConverter}}" 
            Margin="2" 
            Text="{Binding Name}"/>
    </StackPanel>
</HierarchicalDataTemplate>

<HierarchicalDataTemplate 
    x:Key="ContainerTemplate"
    ItemsSource="{Binding Children}">
    <StackPanel Margin="1" Orientation="Horizontal">
        <Ellipse Fill="DarkBlue" Width="14" Height="14"/>
        <TextBlock 
            MouseDown="OnTreeMouseDown" 
            TargetUpdated="OnTargetUpdated"
            Visibility="{Binding Editing, Converter={StaticResource visibilityInverter}}" 
            Margin="5" 
            Text="{Binding Name}"/>
        <TextBox 
            PreviewKeyDown="OnTreeKeyDown" 
            Visibility="{Binding Editing, Converter={StaticResource visibilityConverter}}" 
            Margin="2" 
            Text="{Binding Name}"/>
    </StackPanel>
</HierarchicalDataTemplate>

Есть раздел идентичного XAML:

<TextBlock 
     MouseDown="OnTreeMouseDown" 
     TargetUpdated="OnTargetUpdated"
     Visibility="{Binding Editing, Converter={StaticResource visibilityInverter}}" 
     Margin="5" 
     Text="{Binding Name}"/>
<TextBox 
     PreviewKeyDown="OnTreeKeyDown" 
     Visibility="{Binding Editing, Converter={StaticResource visibilityConverter}}" 
     Margin="2" 
     Text="{Binding Name}"/>

Можно ли перенести это на ресурс и ссылаться на него по имени, а не повторять?

1 Ответ

2 голосов
/ 16 мая 2010

Ответ кажется "почти"

<Style x:Key="textBlockStyle" TargetType="TextBlock">
   <Setter Property="Visibility" Value="{Binding Editing, Converter={StaticResource visibilityInverter}}"/>
   <Setter Property="Margin" Value="4"/>
   <Setter Property="Text" Value="{Binding Name}"/>
   <EventSetter Event="MouseDown" Handler="OnTreeMouseDown"/>
</Style>

<Style x:Key="textBoxStyle" TargetType="TextBox">
   <Setter Property="Visibility" Value="{Binding Editing, Converter={StaticResource visibilityConverter}}"/>
   <Setter Property="Margin" Value="1"/>
   <Setter Property="Text" Value="{Binding Name, NotifyOnSourceUpdated=True}"/>
   <EventSetter Event="PreviewKeyDown" Handler="OnTreeKeyDown"/>
</Style>

Тогда шаблоны уменьшаются до

<HierarchicalDataTemplate 
    x:Key="RecursiveTemplate"
    ItemsSource="{Binding Children}">
    <StackPanel Margin="1" Orientation="Horizontal">
        <Ellipse Fill="DarkGreen" Width="14" Height="14"/>
        <TextBlock 
            Style="{StaticResource textBlockStyle}"/>
        <TextBox 
            SourceUpdated="OnSourceUpdated"
            Style="{StaticResource textBoxStyle}"/>
    </StackPanel>
</HierarchicalDataTemplate>

Однако обратите внимание, что вы не можете поместить SourceUpdated в стиль, так как он не покрыт EventSetter

...