0

在我当前的项目中,我有这个 XAML 文件,我在其中定义了必须应用于不同类型的自定义小部件的视觉样式。

例如,'DirectLineButton'(继承自 WPF 的 Button 的自定义类)的样式如下:

    <Style x:Key="DirectLineButtonTemplate" TargetType="{x:Type View:DirectLineButton}">
<Setter Property="SnapsToDevicePixels" Value="true"/>
<Setter Property="OverridesDefaultStyle" Value="true"/>
<Setter Property="MinHeight" Value="23"/>
<Setter Property="MinWidth" Value="75"/>
<Setter Property="Template">
    <Setter.Value>
    <ControlTemplate TargetType="{x:Type Button}">
        <Border x:Name="MyBorder"  
               CornerRadius="2" 
               BorderThickness="2"
               Background="Gold"
               BorderBrush="Gray">
        <ContentPresenter Margin="2"
             HorizontalAlignment="Center"
             VerticalAlignment="Center"
             RecognizesAccessKey="True"/>
        </Border>
        <ControlTemplate.Triggers>
        <Trigger Property="View:DirectLineButton.State" Value="DirectLineAvailable">
            <Setter TargetName="MyBorder" Property="Background" Value="Gold"/>
        </Trigger>
        <Trigger Property="View:DirectLineButton.State" Value="DirectLineIdle">
            <Setter  TargetName="MyBorder" Property="Background" Value="Silver"/>
        </Trigger>
        <Trigger Property="View:DirectLineButton.State" Value="DirectLineBusy">
            <Setter  TargetName="MyBorder" Property="Background" Value="Green"/>
        </Trigger>
        <Trigger Property="View:DirectLineButton.State" Value="DirectLineCalled">
            <Setter  TargetName="MyBorder" Property="Background" Value="LightBlue"/>
        </Trigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>
    </Setter.Value>
</Setter>
</Style>

现在,我需要通过定义 Rectangle 的样式来复制这个想法。不幸的是,当我尝试为矩形定义 ControlTemplate 时,WPF 会标记一条错误消息,您能建议解决此问题的方法吗?请参阅下面我尝试尝试的代码:

    <Style x:Key="MyRectangleTemplate" TargetType="{x:Type Rectangle}">
<Setter Property="SnapsToDevicePixels" Value="true"/>
<Setter Property="OverridesDefaultStyle" Value="true"/>
<Setter Property="MinHeight" Value="23"/>
<Setter Property="MinWidth" Value="75"/>
<Setter Property="Template">
    <Setter.Value>
    <ControlTemplate TargetType="{x:Type Rectangle}">
        <Border x:Name="MyBorder"  
               CornerRadius="2" 
               BorderThickness="2"
               Background="Gold"
               BorderBrush="Gray">
        <ContentPresenter Margin="2"
             HorizontalAlignment="Center"
             VerticalAlignment="Center"
             RecognizesAccessKey="True"/>
        </Border>
        <ControlTemplate.Triggers>
        <Trigger Property="View:DirectLineButton.State" Value="DirectLineAvailable">
            <Setter TargetName="MyBorder" Property="Background" Value="Gold"/>
        </Trigger>
        <Trigger Property="View:DirectLineButton.State" Value="DirectLineIdle">
            <Setter  TargetName="MyBorder" Property="Background" Value="Silver"/>
        </Trigger>
        <Trigger Property="View:DirectLineButton.State" Value="DirectLineBusy">
            <Setter  TargetName="MyBorder" Property="Background" Value="Green"/>
        </Trigger>
        <Trigger Property="View:DirectLineButton.State" Value="DirectLineCalled">
            <Setter  TargetName="MyBorder" Property="Background" Value="LightBlue"/>
        </Trigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>
    </Setter.Value>
</Setter>
</Style>

提前致谢!

4

3 回答 3

1

嗨,您必须仅使用 Border 来完成。仅继承 FrameworkElement 的控件可以具有 Template 。但是 Rectangle 、 Line 等是较轻的版本,它们只继承 UIElement 而不是 FrameworkElement。我希望这会有所帮助。结论:矩形没有模板属性

于 2012-11-20T16:37:36.160 回答
1

您不能为 a 定义控件模板Rectangle,因为它不是控件,而是 a Shape。您只能为从Control.

于 2012-11-20T16:38:39.037 回答
0

您应该
1) 使用 a Style(不是 a ControlTemplate) 具有圆形边框。
2)Trigger在你的风格中使用。

以下 Xaml 应该让您更接近您的目标:

 <Style x:Key="MyRectangleStyle" TargetType="{x:Type Rectangle}">
       <Setter Property="SnapsToDevicePixels" Value="true"/>
       <Setter Property="OverridesDefaultStyle" Value="true"/>
       <Setter Property="MinHeight" Value="23"/>
       <Setter Property="MinWidth" Value="75"/>
        <Setter Property="Fill" Value="Blue"/>

       <Setter Property="RadiusX" Value="2" />
       <Setter Property="RadiusY" Value="2" />

  <Style.Triggers>
    <DataTrigger Binding="{Binding DirectLineState}" 
                        Value="{x:Static l:DLS.Available}">
        <Setter Property="Fill" Value="Gold"/>
    </DataTrigger>
    <DataTrigger Binding="{Binding DirectLineState}" 
                        Value="{x:Static l:DLS.Idle}" >
        <Setter Property="Fill" Value="Silver"/>
    </DataTrigger >
    <DataTrigger Binding="{Binding DirectLineState}"                            
                         Value="{x:Static l:DLS.Available}">
        <Setter Property="Fill" Value="Green"/>
    </DataTrigger >
    <DataTrigger Binding="{Binding DirectLineState}" 
                         Value="{x:Static l:DLS.Called}">
        <Setter  Property="Fill" Value="LightBlue"/>
    </DataTrigger >
  </Style.Triggers>
</Style>

(请注意:
1)我更改了“MyRectangleStyle”的键。
2)如果您希望这Style是默认值Style,请不要给它一个Key,而只是一个TargetType...
3)...或将其设置Key"{x:Type Rectangle}". msdn 似乎更喜欢这种方式。
顺便说一句:您不应该在公共属性上使用 DataTriggers 而不是 Triggers 吗?但我不知道您的应用程序的整个架构。)

Rq :要使上面的代码正常工作,您需要:
1) 一个名为 DirectLineState 的公共财产NotifyPropertyChanged在更改时引发。
2)enum在项目的单独文件(如类)中定义的称为 DLS
3)您需要“l”作为您的项目名称空间。

     <xmlns:l="clr-namespace:MyProjectNameSpace" >   

4)分配Style和设置适当DataContextRectangle

于 2012-11-21T01:53:02.760 回答