在XAML中为矩形定义控件模板

时间:2012-11-20 16:27:29

标签: wpf controltemplate rectangles

在我当前的项目中,我有这个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>

提前致谢!

3 个答案:

答案 0 :(得分:1)

您好,您必须使用Border only.Controls继承FrameworkElement只能有Template。但是Rectangle,Line等是较轻的版本,它们只继承UIElement而不是FrameworkElement。我希望这会有所帮助。结论:Rectange没有Template属性

答案 1 :(得分:1)

您无法为Rectangle定义控件模板,因为它不是控件,而是Shape。您只能为从Control派生的类定义控件模板。

答案 2 :(得分:0)

你应该    1)使用Style(不是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吗?但我不知道你的应用程序的整个架构。 )

Rq:要使上述代码正常工作,您需要:
1)一个名为DirectLineState的公共物品,在变更时提出NotifyPropertyChanged 2)在项目的单独文件(如类)中定义的enum被称为DLS 3)你需要“l”作为你的项目NameSpace。

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

4)分配Style并为DataContext

设置正确的Rectangle