2013-06-22 2 views
1

나는 시각적 인 상태와 함께 사각형이있는 새 컨트롤을 만들었습니다. controltemplate 내의 객체 스타일 변경

<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

예, 컨트롤의 모든 부분에 대한 사각형의 배경을 변경하고 싶습니다. – 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"/> 

그러나; 일반적으로 단일 개체에 대한 많은 상태 변경 내용을 첨부하지 않는 것이 좋습니다. 예를 들어 Expression Blend에 템플릿을로드하고 템플릿을 편집하는 동안 States 패널을 보면 삼각형 느낌표 아이콘이 표시됩니다.이 아이콘은 하나의 객체 주위에 너무 많은 상태를 기반으로하지 말라고 경고합니다. 귀하의 템플릿. 대부분의 시간은 괜찮지 만 작동 할 것입니다. 또한 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 속성에 바인딩합니다. Button의 기본 컨트롤 템플릿을보고 사용 방법에 대해 더 많이 배우는 것이 좋습니다.

희망이 도움이됩니다.

+0

감사합니다. 의심의 여지없이 나는 많은 실수를하고 있고, 일이 더 잘될 수있다! 내 시험 후에 당신의 솔루션을 체크 아웃해야합니다! 다시 한 번 감사드립니다 :) – user2509714