2013-06-22 58 views
1

我做了一個新的控件,其中包含一個矩形和一些視覺狀態。改變控制模板內物體的風格

<Style TargetType="Button" x:Key="banda"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="Button"> 
         <Grid> 

          <Grid.ColumnDefinitions > 
           <ColumnDefinition Width="*"/> 
          </Grid.ColumnDefinitions> 
          <Grid.RowDefinitions > 
           <RowDefinition Height="*"/> 
          </Grid.RowDefinitions> 
          <VisualStateManager.VisualStateGroups> 
           <VisualStateGroup x:Name="CommonStates"> 
            <VisualStateGroup.Transitions> 
             <VisualTransition GeneratedDuration="0:0:0.1"/> 
            </VisualStateGroup.Transitions> 
            <VisualState x:Name="Pressed"> 
             <Storyboard> 
              <ColorAnimation Duration="0" To="#FF47B215" Storyboard.TargetProperty="(Shape.Stroke).(SolidColorBrush.Color)" Storyboard.TargetName="Border" d:IsOptimized="True"/> 
             </Storyboard> 
            </VisualState> 
            <VisualState x:Name="Normal"> 
             <Storyboard> 
             <ColorAnimation Duration="0" To="{Binding Background, ElementName=Border}" Storyboard.TargetProperty="(Shape.Stroke).(SolidColorBrush.Color)" Storyboard.TargetName="Border" d:IsOptimized="True"/> 
             </Storyboard> 
            </VisualState> 
            <VisualState x:Name="Disabled"/> 
            <VisualState x:Name="MouseOver"> 
             <Storyboard> 
              <ColorAnimation Duration="0" To="#FF86B072" Storyboard.TargetProperty="(Shape.Stroke).(SolidColorBrush.Color)" Storyboard.TargetName="Border" d:IsOptimized="True"/> 
             </Storyboard> 
            </VisualState> 
           </VisualStateGroup> 
          </VisualStateManager.VisualStateGroups> 
         <Border x:Name="Border" Background="purple" StrokeThickness="5" Stroke="{Binding Background, ElementName=Border}"/> 
         </Grid> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
     </Style> 

這種控制是使用多次在我的應用程序頁面,我想在每一個矩形它的使用時間,有不同的顏色值,例如,當我按下一個按鈕,矩形改變顏色。

我不知道如何改變c#代碼中矩形的屬性。有人可以幫我格式化嗎?

+0

所以你只是想有能力在你使用它的每個實例中設置默認背景顏色? –

+0

是的,我想改變矩形的背景爲控制的每一個istance – user2509714

回答

0

沒有汗水,只需通過綁定它的Background就可以將該功能構建到模板中;

<Style TargetType="Button" x:Key="banda"> 
      <Setter Property="Background" Value="Purple"/> 
      <Setter Property="BorderThickness" Value="5"/> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="Button"> 
         <Grid> 
          <VisualStateManager.VisualStateGroups> 
           <VisualStateGroup x:Name="CommonStates"> 
            <VisualStateGroup.Transitions> 
             <VisualTransition GeneratedDuration="0:0:0.1"/> 
            </VisualStateGroup.Transitions> 
            <VisualState x:Name="Pressed"> 
             <Storyboard> 
              <ColorAnimation Duration="0" To="#FF47B215" Storyboard.TargetProperty="(Shape.Stroke).(SolidColorBrush.Color)" Storyboard.TargetName="Border" d:IsOptimized="True"/> 
             </Storyboard> 
            </VisualState> 
            <VisualState x:Name="Normal"> 
             <Storyboard> 
             <ColorAnimation Duration="0" To="{Binding Background, ElementName=Border}" Storyboard.TargetProperty="(Shape.Stroke).(SolidColorBrush.Color)" Storyboard.TargetName="Border" d:IsOptimized="True"/> 
             </Storyboard> 
            </VisualState> 
            <VisualState x:Name="Disabled"/> 
            <VisualState x:Name="MouseOver"> 
             <Storyboard> 
              <ColorAnimation Duration="0" To="#FF86B072" Storyboard.TargetProperty="(Shape.Stroke).(SolidColorBrush.Color)" Storyboard.TargetName="Border" d:IsOptimized="True"/> 
             </Storyboard> 
            </VisualState> 
           </VisualStateGroup> 
          </VisualStateManager.VisualStateGroups> 
         <Border x:Name="Border" Background="{TemplateBinding Background}" BorderThickness="{TemplateBinding BorderThickness}" BorderBrush="{Binding Background, ElementName=Border}"/> 
         </Grid> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

於是就這樣,默認的顏色將是紫色的(如被看見在Setter聲明),你可以改變它的飛行等;

<Button Style="{StaticResource banda}" Content="Blah" Background="Orange"/> 

但是;通常建議您不要將多個狀態更改附加到單個對象。例如,如果將模板加載到「表達式」混合中,則會在編輯模板時查看「狀態」面板,您會看到一個三角形感嘆號圖標,警告您不建議將基於太多狀態的單個對象你的模板。大多數情況下,它的罰款,並會按原樣工作。你也有Stroke & StrokeThickness適用於Border它沒有那些依賴屬性,所以在這個例子中,我也修復了這個以及BorderThicknessBorderBrush。哦,你可能也會發現你有你的財產,所以相互關係限制了它會給你帶來麻煩。把事情拋諸如;

      <VisualState x:Name="Normal"> 
           <Storyboard> 
           <ColorAnimation Duration="0" To="{Binding Background, ElementName=Border}" Storyboard.TargetProperty="(Shape.Stroke).(SolidColorBrush.Color)" Storyboard.TargetName="Border" d:IsOptimized="True"/> 
           </Storyboard> 
          </VisualState> 

,而是僅僅爲了通過{TemplateBinding Background}其綁定到Background屬性。我會建議尋找一些按鈕的默認控制模板,並比較以瞭解更多關於它們的使用方法。

希望這會有所幫助。

+0

非常感謝!毫無疑問,我犯了很多錯誤,事情可以做得更好!我會在考試結束後檢查你的解決方案!再次感謝 :) – user2509714