2017-05-12 8 views
0

버튼 템플릿을 만들었습니다. 이미지와 라벨이 있습니다. 이미지의 원본은 ResourceDictionary Pictures에 있습니다. 그림의 원본은 흰색 브러시 색상이있는 DrawingImage입니다.버튼을 눌렀을 때 기하학 드로잉 브러시의 색 변경

<DrawingImage x:Key="Moduly"> 
    <DrawingImage.Drawing> 
    <DrawingGroup> 
     <GeometryDrawing Brush="{Binding BackgroundColor}" Geometry="M 0,0L 32,0L 32,32L 0,32L 0,0 Z " /> 
     <GeometryDrawing Brush="{Binding IconColor}" Geometry="M800.336 949.171H184.527c-80.603 0-136.768-65.56-136.768-146.159V203.677 c0-80.602 56.166-152.42 136.768-152.42h615.809c80.598 0 149.289 71.818 149.289 152.42v599.334 C949.625 883.611 880.934 949.171 800.336 949.171L800.336 949.171z M874.488 203.677c0-39.184-34.99-77.287-74.152-77.287H184.527 c-39.166 0-61.632 38.103-61.632 77.287v599.334c0 39.182 22.466 71.024 61.632 71.024h615.809 c39.162 0 74.152-31.843 74.152-71.024V203.677L874.488 203.677z M273.604 613.832h447.829v75.134H273.604V613.832L273.604 613.832z M273.604 463.566h447.829v75.131H273.604V463.566L273.604 463.566z M273.604 313.295h447.829v75.134H273.604V313.295 L273.604 313.295z" />     
    </DrawingGroup> 
    </DrawingImage.Drawing>  
</DrawingImage> 

모든 스타일 소스 (Button, StackPanel, Label)는 리소스 사전 스타일에 있습니다.

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Style TargetType="Button"> 
    <Setter Property="BorderBrush" Value="Black"/> 
    <Setter Property="Background" Value="#103255"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
     <ControlTemplate TargetType="{x:Type Button}"> 
      <Border Background="{TemplateBinding Background}"> 
      <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/> 
      </Border> 
     </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    <Style.Resources>   
     <Style TargetType="StackPanel"> 
     <Style.Resources> 
      <Style TargetType="Label"> 
      <Setter Property="Foreground" Value="White" /> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding IsPressed, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Button}}}" 
          Value="True"> 
       <Setter Property="Foreground" Value="#103255" /> 
       </DataTrigger> 
      </Style.Triggers> 
      </Style>     
     </Style.Resources> 
     </Style> 
    </Style.Resources> 
    <Style.Triggers> 
     <Trigger Property="IsMouseOver" Value="True"> 
     <Setter Property="Background" Value="#103255"/> 
     <Setter Property="BorderBrush" Value="Black"/>     
     </Trigger> 
     <Trigger Property="IsPressed" Value="True"> 
     <Setter Property="Background" Value="White"/> 
     <Setter Property="BorderBrush" Value="White"/> 
     </Trigger> 
    </Style.Triggers> 
    </Style>   
</ResourceDictionary> 

나는 버튼을 누를 때 DrawingImage의 브러시 색상을 변경해야합니다. 누른 버튼 안의 특정 사진 한 개만.

<Button Grid.Column="0" Grid.Row="2" Name="modulyButton" 
     HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 
     BorderThickness="3" Margin="0,0,0,0"> 
    <StackPanel Orientation="Vertical" Name="modulyStackPanel" 
       HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> 
    <Image x:Name="modulyImage" Source="{StaticResource Moduly}" 
      HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 
      Height="30" Width="30"/> 
    <Label x:Name="modulyLabel" Content="MODULY" 
      VerticalAlignment="Center"/> 
    </StackPanel> 
</Button> 

해결책이있는 사람이 있습니까?

+0

지금까지 해보신 것은 무엇입니까? –

+0

이미지 스타일 트리거를 만들려고합니다. 그러나 문제가 있습니다. 이미지에 색상 지정이 없습니다. –

+0

내 다음 아이디어는 리소스 사전 그림 내부에 드로잉 이미지 트리거를 직접 생성하는 것이 었습니다. 조상 사용하기. 그러나 이것이 실제로 가능한지 나는 모른다. –

답변

0

내가 만든 구조로는 아무런 방법이 없다고 생각합니다. 컴파일시 ButtonImage 올바른 유형의 StaticResourceSource 속성에 할당 된 것으로 만 알고 있지만, 그렇게 거기 Source 인스턴스가 Brush 속성을 가지고 DrawingGroup 2 요소를 가지고 있다는 것을 알고하지 않습니다 Image.Triggers에있는 Brush 속성을 호출 할 방법이 없습니다. 전체를 DrawingImage으로 바꿔야합니다.

(그린/레드 컬러 스위치와 단순화 된 형태로) 내 솔루션 :

1) 동일 Geometry하지만 서로 다른 Brush으로, 두 DrawingImage 만들기 :

<DrawingImage x:Key="Moduly1"> 
    <DrawingImage.Drawing> 
    <DrawingGroup> 
     <GeometryDrawing Brush="Green" Geometry="M 0,0L 32,0L 32,32L 0,32L 0,0 Z" /> 
    </DrawingGroup> 
    </DrawingImage.Drawing> 
</DrawingImage> 

<DrawingImage x:Key="Moduly2"> 
    <DrawingImage.Drawing> 
    <DrawingGroup> 
     <GeometryDrawing Brush="Red" Geometry="M 0,0L 32,0L 32,32L 0,32L 0,0 Z" /> 
    </DrawingGroup> 
    </DrawingImage.Drawing> 
</DrawingImage> 

2)를 Button에서

<Style TargetType="StackPanel"> 
    <Style.Resources> 
    <Style TargetType="Label"> 
     <Setter Property="Foreground" Value="White" /> 
     <Style.Triggers> 
     <DataTrigger Binding="{Binding IsPressed, 
         RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Button}}}" 
        Value="True"> 
      <Setter Property="Foreground" Value="#103255" /> 
     </DataTrigger> 
     </Style.Triggers> 
    </Style> 
    <!-- ADDED PART --> 
    <Style TargetType="Image"> 
     <Setter Property="Source" Value="{StaticResource ResourceKey=Moduly1}"/> 
     <Style.Triggers> 
     <DataTrigger Binding="{Binding IsPressed, 
         RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Button}}}" 
        Value="True"> 
      <Setter Property="Source" Value="{StaticResource ResourceKey=Moduly2}" /> 
     </DataTrigger> 
     </Style.Triggers> 
    </Style> 
    <!-- END ADDED PART --> 
    </Style.Resources> 
</Style> 
: 내부 StackPanel 스타일이 쓰기합니다 ( ResourceDictionary에서)

3) 특정 사용자가 Button 인 경우 Image 요소에서 Source 속성을 제거하십시오.

+0

감사합니다. 나는 당신의 솔루션을 시도하고 그것은 작동합니다! 하지만 하나 이상의 단추가 있습니다. 나는 좀 더 일반적인 해결책이 필요하다. 아마 나는 이미지를 ViewBox로 대체해야합니까? 한 예에서 Binding Color와 Source로 Path를 채울 가능성이 있음을 알았습니다. –

+0

같은 템플릿 (라벨, 이미지, 그 스타일, 레이아웃, 여백 등)이있는 많은 버튼을 원하고 레이블 텍스트와 이미지 소스를 버튼에서 버튼으로 만 변경하고 싶을 것입니다. Button에 바인딩 된 명령). 매번 템플릿의 xaml을 반복하지 않으려면 Button의 코드와 일부 [DependencyProperty] (https://msdn.microsoft.com/en-us)를 사용하여 UserControl을 만드는 것이 좋습니다./library/ms752914) (예 : "TextProperty"및 "ImageSourceProperty"등)을 UC의 내부 구성 요소 속성과 바인딩합니다. –