2013-07-09 2 views
4

나는 여전히 블렌드를 배우고 있으므로 나와 함께 견뎌주십시오. WPF 프로젝트에서 토글 단추가 있고 mouseover 및 checked와 같은 다른 상태의 텍스트 색을 변경해야합니다. 그러나 템플릿을 편집 할 때 contentPresenter를 선택할 때 유일한 브러시는 OpacityMask이며 브러시 색상 변경의 영향을받지 않습니다.Expression Blend에서 여러 상태의 단추 텍스트 색을 변경하려면 어떻게합니까?

물론 스타일을 편집하여 텍스트 색상을 변경할 수는 있지만 이는 편집 과정에서 흥미로운 상태이므로 유용하지 않습니다.

기본적으로 마우스 오버, 호버 등에서 단추의 텍스트를 변경하기 만하면되는데, 합리적인 것 같지만 ContentPresenter의 OpacityMask Brush는 편집 할 수 없습니다.

ContentPresenter를 ContentControl으로 변경하기 위해 언급 된 누군가가 있습니다. 이 작동하지만 이제 단추의 인스턴스에 대한 텍스트를 편집 할 수 없습니다. ContentControl을 무언가에 연결해야합니까?

도움을 주셔서 감사합니다. 나는 몇 시간 동안 여기에 머물렀다. 나는 아무 쓸데없이 대답을 찾고 있었다.

+0

나는 당신이 왜 스타일로 할 수 없는지 이해하지 못합니다. –

+0

안녕하세요 Viktor, 많은 답변을 주셔서 감사합니다. 그러나 가능한 경우 텍스트 속성을 사용하여 많은 작업을 수행함에 따라 좀 더 유연한 (예 : 설정하고 잊어 버리십시오) 매번 트리거를 설정하려고합니다. Viv의 답변은 제가 따라 왔던 대답이었습니다. 그러나 업데이트 부분은 마치 텍스트가 단순히 텍스트 상자 인 것처럼 텍스트로 작업 할 수있게 해주었습니다. 많은 도움을 주셔서 감사합니다. –

답변

1

당신은 ContentControl를 사용하지 않고 그냥 내가 물론 스타일을 편집하여 텍스트 색상을 변경할 수 있습니다 VisualStateManager

를 사용하여이 찾고 무엇을 할 수 있지만,이 유용하지 않다 나는 편집 할 때 흥미로운 주들 안에있다. 그래서 상태, 예를 들어 말을

Button 템플릿을 편집 할 때

  • 은 첫째로 혼합이 Button.MouseOver.Foreground에 대한 Brush 자원을 만들지 않습니다, ButtonMouseOver 귀하의 텍스트에 새 Foreground 색상을 적용합니다.

그럼 하나 만들어 보겠습니다.

<SolidColorBrush x:Key="Button.MouseOver.Foreground" Color="Tomato" /> 
  • 지금 우리는 contentPresenterTextElement.ForegroundStoryboard을 적용 할 수 있습니다 (다만 다른 브러시 자원과 함께 다음 줄을 추가합니다).

그래서 당신의 VSM은 다음과 같이 표시됩니다

<VisualStateManager.VisualStateGroups> 
    <VisualStateGroup x:Name="CommonStates"> 
     <VisualState x:Name="Normal"/> 
     <VisualState x:Name="MouseOver"> 
     <Storyboard> 
     <ObjectAnimationUsingKeyFrames Storyboard.TargetName="contentPresenter" 
             Storyboard.TargetProperty="(TextElement.Foreground)"> 
      <DiscreteObjectKeyFrame KeyTime="0"> 
      <DiscreteObjectKeyFrame.Value> 
       <SolidColorBrush Color="{Binding Source={StaticResource Button.MouseOver.Foreground}, Path=Color}" /> 
      </DiscreteObjectKeyFrame.Value> 
      </DiscreteObjectKeyFrame> 
     </ObjectAnimationUsingKeyFrames> 
     </Storyboard> 
     </VisualState> 
     <VisualState x:Name="Pressed"/> 
     <VisualState x:Name="Disabled"/> 
    </VisualStateGroup> 
</VisualStateManager.VisualStateGroups> 

하고 그게 다에요.

괜찮을 것 우리가 여기서 무슨 일을하는지주의 마십시오 ButtonContent 그냥 텍스트가있다,하지만 귀하의 질문에 언급 한 바와 같이 사용량이 무엇인지 이후, 당신이 잘되어야합니다.

(!) 참고 :

당신은 단지 ControlTemplateTextBlockContentPresenter을 전환하여 똑같은 일을 할 수 있습니다.

당신이 Foreground 다음 예치 그냥 ContentControlContentPresenter 전환의 ButtonContent 사용할 수 있으며 필요한 경우 할 수 있습니다 여전히 VSM 스토리 보드의 매우 유사한 방식이다.

업데이트 :

ControlTemplate에서는, ContentControlContentPresenter를 전환하려면 그냥 새 것으로 실제 요소를 전환 할 수 있습니다.

<ControlTemplate TargetType="{x:Type Button}"> 
    ... 
    <ContentPresenter x:Name="contentPresenter" Focusable="False" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" RecognizesAccessKey="True"/> 
    ... 
</ControlTemplate> 

에 :

<ControlTemplate TargetType="{x:Type Button}"> 
    ... 
    <ContentControl x:Name="contentPresenter" Focusable="False" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" Content="{TemplateBinding Content}"/> 
    ... 
</ControlTemplate> 

그에 따라 RecognizesAccessKeys를 지원하지 않습니다 예를 들어 ContentControl 위해 같은 자신의 속성을 업데이트해야하고 또한 실제로 콘텐츠를 표시하는 데에 Content="{TemplateBinding Content}" 설정이 필요합니다. ContentPresenter을 사용하면 Content 속성이 암시 적으로 설정됩니다.

+0

안녕하세요,이 점에 대해 많은 감사를드립니다. 지금 시도하고 있습니다. 한 가지 - ContentPresenter를 ContentControl으로 변경하는 것이 가능합니까? 어떻게해야합니까? 또는 ContentControl 또는 textblock을 컨트롤 템플릿에 추가하면 이제 텍스트 블록이 버튼의 내용 인 부분이되도록 텍스트 파일을 만들 수 있습니까? –

+0

@JohnRooney 게시물 하단에서 내 업데이트를 확인하십시오. 또한 커스텀'Button.Style'의 다른 예제를 검색하면 이것들에 대한 적절한 예를 찾을 수 있습니다. 내가 생각할 수있는 모든 비트를 추가하면, 우리는 몇 시간 동안 여기있을 것입니다.'wpf button ContentPresenter vs ContentControl','wpf button 자식 컨트롤에 동적 색상 적용하기 ','wpf 왜 templateBinding을 사용해야하는지'와 같은 구글 검색 용어와 함께 가서 읽고 읽을 톤이 있어야한다. – Viv

+0

많은 viv, 마지막 업데이트에서 텍스트에 대해 더 많은 작업을 수행해야하므로 콘텐트를 바로 바꾸는 것이 더 나은 옵션이었습니다. 고마워, 너는 나에게 많은 두통을 덜어 줬어. 어디서나 솔루션을 찾을 수 없었다. –

1

전경 속성이 스타일에있다. 그래서 당신은 스타일을 편집 할 수 있고 Foreground을 설정할 수 있습니다. 그것은이

<Style.Triggers> 
    <Trigger Property="IsChecked" Value="False"> 
     <Setter Property="Foreground" Value="Blue"/> 
    </Trigger> 
</Style.Triggers> 

같은 수 또는 당신은 ControlTemplate에서 변경하려는 경우 당신은 이런 식으로 할 수 있습니다.

<Trigger Property="IsChecked" Value="True"> 
    <Setter Property="TextBlock.Foreground" TargetName="contentPresenterName" Value="White"/> 
</Trigger> 

그래서 표현의 조화에 당신은 자원 패널에서 스타일을 찾아이

  1. 처럼 수행하고 다음 리소스에 대한 편집 자원 버튼을 클릭합니다. 또는 마우스 오른쪽 버튼을 클릭하고 을 편집으로 선택하십시오.
  2. 트리거를 에 추가하십시오. 트리거 패널.
  3. 속성 패널로 이동하여 전경 속성을 변경하십시오.
관련 문제