【问题标题】:Reusing Same Template for Multiple Elements为多个元素重用相同的模板
【发布时间】:2017-03-01 09:08:29
【问题描述】:

我正在我的应用程序中创建按钮样式,但我注意到对于每个按钮我必须一次又一次地重复相同的步骤,我正在以下模板中寻找一种方法,以便我可以传递 Path 元素的特定属性或每个按钮的路径不同,但所有其他元素将相同且顺序相同,我尝试在这里搜索但无法找到对我有帮助的任何特定示例,这是 xaml :

<ControlTemplate x:Key="ButtonTemplate" TargetType="{x:Type Button}">
        <Grid x:Name="MainGrid">
            <Rectangle 
        x:Name="MainRectangle" 
        Fill="#00000000" 
        RadiusX="5" 
        RadiusY="5"/>
            <ContentPresenter 
            x:Name="Presenter" 
            HorizontalAlignment="Center" 
            VerticalAlignment="Center" 
            TextBlock.Foreground="#BB225588"/>
            <Path Name="Minimize" Data="M0,0L32,0 32,8.6899995 0,8.6899995z" Stretch="Fill" Fill="White"  StrokeThickness="2" Width="17" Height="5" VerticalAlignment="Center" HorizontalAlignment="Center"
                Stroke="White" >
            </Path>
        </Grid>
        <ControlTemplate.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Effect">
                    <Setter.Value>
                        <DropShadowEffect ShadowDepth="2" Color="White"  BlurRadius="20"></DropShadowEffect>
                    </Setter.Value>
                </Setter>
            </Trigger>
            <Trigger Property="IsPressed" Value="True">
                <Setter TargetName="MainRectangle" Property="Fill" Value="{StaticResource ClickEffect}"/>
                <Setter TargetName="Minimize" Property="Stroke" Value="White" />
            </Trigger>

        </ControlTemplate.Triggers>
    </ControlTemplate>

现在在上面的模板中,我想要的是某种方式与每个按钮绑定 Path 元素属性或某种方式为每个按钮注入不同的 Path 元素,其余部分将保持不变,所以我不想重复同样的风格一次又一次。我怎样才能实现它。

【问题讨论】:

标签: wpf xaml controltemplate resourcedictionary


【解决方案1】:

您可以使用Path 的每个属性创建一个自定义Button 控件,并使用TemplateBinding 标记扩展名在ControlTemplate 中设置并绑定到这些属性。例如:

控制:

public class PathButton : Button
{
    public static readonly DependencyProperty FillProperty =
         DependencyProperty.Register("Fill", typeof(Brush),
         typeof(PathButton), new FrameworkPropertyMetadata(Brushes.White));

    public Brush Fill
    {
        get { return (Brush)GetValue(FillProperty); }
        set { SetValue(FillProperty, value); }
    }
}

模板:

<ControlTemplate x:Key="ButtonTemplate" TargetType="{x:Type local:PathButton}">
    <Grid x:Name="MainGrid">
        <Rectangle 
                    x:Name="MainRectangle" 
                    Fill="#00000000" 
                    RadiusX="5" 
                    RadiusY="5"/>
        <ContentPresenter 
                    x:Name="Presenter" 
                    HorizontalAlignment="Center" 
                    VerticalAlignment="Center" 
                    TextBlock.Foreground="#BB225588"/>
        <Path Name="Minimize" Data="M0,0L32,0 32,8.6899995 0,8.6899995z" Stretch="Fill"
                      Fill="{TemplateBinding Fill}"
                      StrokeThickness="2" Width="17" Height="5" VerticalAlignment="Center" HorizontalAlignment="Center"
                      Stroke="White" >
        </Path>
    </Grid>
    <ControlTemplate.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Effect">
                <Setter.Value>
                    <DropShadowEffect ShadowDepth="2" Color="White"  BlurRadius="20"></DropShadowEffect>
                </Setter.Value>
            </Setter>
        </Trigger>
        <Trigger Property="IsPressed" Value="True">
            <Setter TargetName="MainRectangle" Property="Fill" Value="{StaticResource ClickEffect}"/>
            <Setter TargetName="Minimize" Property="Stroke" Value="White" />
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

用法:

<local:PathButton Content="content" Template="{StaticResource ButtonTemplate}" Fill="Red"  />

【讨论】:

  • 这不是很多工作,例如,如果我有 10 个按钮,每个按钮都有不同的形状,我使用 Path 制作的所有形状,只是颜色和 Data 属性正常更改跨度>
  • 我不懂你。您为希望能够在不修改模板的情况下更改的每个设置创建一个属性。不能再简单了。有什么问题?
  • 我需要在使用模板时注入特定的属性,例如路径元素的数据属性
  • 然后你应该向控件添加一个依赖属性并将 Path 的 Data 属性绑定到它,就像我向你展示的那样。你没看我的回答吗?除了依赖属性的类型外,完全一样。
  • 但是你创建了一个新类型,我不想这样做
猜你喜欢
  • 2016-07-15
  • 1970-01-01
  • 1970-01-01
  • 2017-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-12
  • 1970-01-01
相关资源
最近更新 更多