0

現在のプロジェクトでは、この XAML ファイルを使用して、さまざまな種類のカスタム ウィジェットに適用する必要があるビジュアル スタイルを定義しています。

たとえば、'DirectLineButton' (WPF のボタンから継承するカスタム クラス) のスタイルは次のとおりです。

    <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 only.Controls を継承する FrameworkElement のみで行う必要があります Template を持つことができます。ただし、 Rectangle 、 Line などは FrameworkElement ではなく UIElement のみを継承する軽量バージョンです。これが役立つことを願っています。結論: Rectange には Template プロパティがありません

于 2012-11-20T16:37:36.160 に答える
1

Rectangleはコントロールではなく であるため、 のコントロール テンプレートを定義することはできませんShape。から派生したクラスのコントロール テンプレートのみを定義できますControl

于 2012-11-20T16:38:39.037 に答える
0


1) Style(ではなくControlTemplate) a を使用して、境界線を丸くする必要があります。
2)Triggerスタイルの中に a を使用します。

次の 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) これをデフォルトにし
たい場合は、 を指定せずに... 3 ) ...または を に設定します。msdn はその方法を好むようです。 ところで: Triggers の代わりにパブリックプロパティで DataTriggers を使用すべきではありませんか?しかし、私はあなたのアプリケーションのアーキテクチャ全体を知りません。)StyleStyleKeyTargetType
Key"{x:Type Rectangle}"

Rq : 上記のコードが機能するには、次のものが必要です
。1) 変更時に発生する DirectLineState と呼ばれるパブリック プロパティNotifyPropertyChanged
2)enumプロジェクト内の別のファイル (クラスなど) で定義された呼び出された DLS
3) プロジェクトの NameSpace には "l" が必要です。

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

Style4)に適切な割り当てと設定DataContextを行います。Rectangle

于 2012-11-21T01:53:02.760 に答える