2012-08-06 4 views
2

다른 단추에 대해 다양한 그래픽을 그리는 PathGeometry 인스턴스가 여러 개 있습니다. 그래서 Path.Stroke를 버튼 상태에 따라 업데이트하는 Path를 보여주는 버튼 타입을 만들었습니다. 마우스가 끝나면 비활성화되고 다른 색상으로 표시되면 회색으로 표시됩니다. 표준 물건 ...SetTargetName이 BasedOn 설정의 요소에 대해 작동하지 않습니다.

<Style x:Key="BasePathButton" TargetType="{x:Type Button}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type Button}"> 
       <Border Name="Border" 
        <Path x:Name="Path" /> 
       </Border> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsEnabled" Value="False"> 
         <Setter TargetName="Path" Property="Stroke" Value="Gray"/> 
        </Trigger> 
        <Trigger Property="IsMouseOver" Value="True"> 
         <Setter TargetName="Path" Property="Stroke" Value="Green"/> 
        </Trigger> 
        <Trigger Property="IsPressed" Value="True"> 
         <Setter TargetName="Path" Property="Stroke" Value="Red"/> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

분명히 나는 ​​각 버튼 인스턴스마다 다른 Path.Data가 필요합니다. 그래서 ...이처럼 Path.Data을 설정

<Style x:Key="NLB" TargetType="{x:Type Button}" BasedOn="{StaticResource BasePathButton}"> 
    <Setter TargetName="Path" Property="Data" Value="{StaticResource LeftPathGeometry}"/> 
</Style> 

을 BasedOn 스타일을 만들 ...하지만이 targetName을 = "경로"를 찾을 수 없다는 오류와 함께 실패합니다. 어떤 아이디어가 이것을 고치는 방법? 또는 사용할 형상으로 매개 변수화 된 경로가있는 단추를 만드는 더 나은 방법일까요?

답변

9

이름을 통해 템플릿의 요소를 대상으로 할 수 없으며 다른 이름 범위이기도합니다. TargetNameControlTemplate.Triggers에서만 작동합니다. 데이터를 DynamicResource으로 참조한 다음 개별 스타일에 리소스를 추가 할 수 있습니다.

여기

<Style x:Key="..." BasedOn="..."> 
    <Style.Resources> 
     <!-- not sure if this actually works, you could also try DynamicResource here --> 
     <StaticResource x:Key="PathData" ResourceKey="LeftPathGeometry"/> 
    </Style.Resources> 
</Style> 

<Path Data="{DynamicResource PathData}" .../> 
전체 독립 예는이 기술 (! 동적으로 컴파일 된 XAML와 함께 작동하도록 나타납니다) 보여주고있다 :

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:sys="clr-namespace:System;assembly=mscorlib" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Page.Resources> 
    <SolidColorBrush x:Key="RedBrush" Color="Red"/> 
    <SolidColorBrush x:Key="BlueBrush" Color="Blue"/> 

    <Style x:Key="BaseStyle" TargetType="Button"> 
     <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="Button"> 
      <Border BorderBrush="{DynamicResource StyleBrush}" BorderThickness="3" Padding="5"> 
       <ContentPresenter TextElement.Foreground="{DynamicResource StyleBrush}"/> 
      </Border> 
      </ControlTemplate> 
     </Setter.Value> 
     </Setter> 
    </Style> 
    <Style x:Key="RedStyle" BasedOn="{StaticResource BaseStyle}" TargetType="Button"> 
     <Style.Resources> 
     <StaticResource x:Key="StyleBrush" ResourceKey="RedBrush"/> 
     </Style.Resources> 
    </Style> 
    <Style x:Key="BlueStyle" BasedOn="{StaticResource BaseStyle}" TargetType="Button"> 
     <Style.Resources> 
     <StaticResource x:Key="StyleBrush" ResourceKey="BlueBrush"/> 
     </Style.Resources> 
    </Style> 
    </Page.Resources> 
    <StackPanel> 
    <Button Content="Test" Style="{StaticResource RedStyle}"/> 
    <Button Content="Test" Style="{StaticResource BlueStyle}"/> 
    </StackPanel> 
</Page> 
+0

을하지만이를 할당하지 않습니다 경로를 기본 스타일로. –

+0

@PhilWright : 참조가 동적이기 때문에 다른 속성으로 테스트했지만 방금 해 봤습니다. 독립 실행 형 예를 추가했습니다. –

+0

불편을 끼쳐 드려 죄송 합니다만, 한번 보시고 싶다면 거의 동일한 것을하기 위해 힘든 시간을 보내고 있습니다 : http://stackoverflow.com/questions/41062079/error-when-using-staticresourceextension-inside 스타일 - 자원 – heltonbiker

관련 문제