2011-03-10 2 views
1

Style, Style.TriggerProperty-Setters에 대한 설명을 읽었지만 스타일이 적용되었거나 완전히 무작위 인 것으로 보이는 경우에도 여전히 그렇습니다. 다음 예에서WPF 스타일 속성 설정자가 모든 유형에서 작동하지 않음

CanvasPath하지만, 전혀 영향을받지 않습니다, 흰색으로 바뀝니다 :

<UserControl x:Class="Still.Tooll.CurveEditPoint" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:Still.Tooll" 
      > 
    <UserControl.Style> 
     <Style> 
      <Style.Triggers> 
       <Trigger Property="local:CurveEditPoint.IsSelected" Value="true"> 
        <Setter Property="Path.Stroke" Value="#fff"/> 
        <Setter Property="Canvas.Background" Value="#fff"/> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </UserControl.Style> 
    <Canvas> 
     <Path StrokeThickness="0.5" Data="M 0, 0 L 40,20"/> 
    </Canvas> 
</UserControl> 

을 나는 이것이 Canvas 내부의 Path의 중첩으로 뭔가를하는 것 같아요, 그러나 다시 한번, 컨트롤의 하위 요소를 스타일 화하는 방법이 있어야합니다.

나는 HTML/CSS에서 오는 것을 인정해야하는데, WPF 스타일링이 불필요하게 어렵다는 것을 알았습니다! 모든 요점이나 설명을 환영합니다! 당신은 UserControl을에 ResourceStyle를 정의하고 각 요소에 적용이 작동 할 경우

덕분에, 톰

답변

2

그런 식으로 UserControl의 시각적 요소에 액세스 할 수 없다. 스타일은 UserControl에서만 속성을 설정할 수 있습니다. 따라서 첫 번째 setter ("Path.Stroke")는 Path라는 UserControl의 속성을 찾고 Stroke를 설정합니다. 그것은 UserControl 또는 아래 정의한 하나의 모든 경로에 적용되지 않습니다.

Canvas 님의 배경이 설정되지 않았습니다. UserControl의 배경을 설정 중이며 캔버스에 배경이 계속 표시되지 않습니다. Setter가 UserControl에서 작동하는 이유는 Canvas.BackgroundPropertyUserControl.BackgroundProperty이 (서로 다른 소유자 임에도 불구하고) 동일한 종속성 속성이기 때문입니다.

귀하의 스타일에 의해 변경되고 요소에 바인딩 된 UserControl에 종속성 속성을 표시하는 것이 좋습니다. 이 같은 (배경/전경 속성을 재사용) :

<UserControl x:Name="userControl" x:Class="Still.Tooll.CurveEditPoint" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:local="clr-namespace:Still.Tooll" 
     > 

    <UserControl.Style> 
     <Style> 
      <Style.Triggers> 
       <Trigger Property="local:CurveEditPoint.IsSelected" Value="true"> 
        <Setter Property="Foreground" Value="#fff"/> 
        <Setter Property="Background" Value="#fff"/> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </UserControl.Style> 

    <Canvas> 
     <Path Stroke="{Binding Element=userControl, Path=Foreground}" StrokeThickness="0.5" Data="M 0, 0 L 40,20"/> 
    </Canvas> 
</UserControl> 
+0

우수 답변. 내가 예상했던 것만은 아니지만, 적어도 나는 이런 종류의 문제를 어떻게 처리해야하는지 이해하고 있습니다. – pixtur

0

: 비록

<UserControl x:Class="Still.Tooll.CurveEditPoint" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:local="clr-namespace:Still.Tooll" 
     > 

<UserControl.Resources> 

    <Style x:Key="style"> 
     <Style.Triggers> 
      <Trigger Property="local:CurveEditPoint.IsSelected" Value="true"> 
       <Setter Property="Path.Stroke" Value="#fff"/> 
       <Setter Property="Canvas.Background" Value="#fff"/> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</UserControl.Resources> 

<Canvas Style="{StaticResource style}"> 
    <Path StrokeThickness="0.5" Data="M 0, 0 L 40,20" Style="{StaticResource style}"/> 
</Canvas> 

+0

아, 나는 이미 그것으로 놀았습니다. 그러나 Style 정의에서 직접 하위 요소에 액세스하는 방법은 없습니다. 각 개별 UiElement - 스타일 - 마크 업과 마크 업 간의 상호 참조는 불필요한 복잡한 묶음처럼 보입니다. – pixtur

0

하지 통해 스타일이지만 여기에 내 애플 리케이션 에서이 일을 달성하는 데 사용되는 해결 방법입니다.

ListBox deviceImagesListBox = UtilityFunctions.FindVisualChild<RealisticListBox>(selectedRoomListBox); 지금 당신이 제어 할 수 있습니다 당신은 뒤에 코드에서 그것으로 재생할 수 있습니다 -

* 비주얼 아동 찾기 *

/// <summary> 
    /// This function iterates through the visual tree and returns the child item of the type child item. 
    /// </summary> 
    /// <typeparam name="childItem"></typeparam> 
    /// <param name="obj"></param> 
    /// <returns></returns> 
    public static TChild FindVisualChild<TChild>(DependencyObject obj) 
     where TChild : DependencyObject 
    { 
     for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++) 
     { 
      DependencyObject child = VisualTreeHelper.GetChild(obj, i); 

      if (child != null && child is TChild) 
      { 
       return (TChild)child; 
      } 
      else 
      { 
       TChild childOfChild = FindVisualChild<TChild>(child); 

       if (childOfChild != null) 
       { 
        return childOfChild; 
       } 
      } 
     } 

     return null; 
    } 

같은 뒤에 몇 가지 코드를 사용합니다. 나는 우리가 XAML에서 스타일을 사용하여이를 달성 할 뭔가를 찾아야한다고 동의한다.

+0

아, 아주 멋지다. 지금은 스타일 변경 작업을 수행하기 위해 속성 변경 핸들러의 코드를 사용하고 있습니다. 하지만 난 깨끗한 코드/UI/스타일 분리를 달성하기 위해 이것을 피하기 위해 열심히 노력하고있어. – pixtur

+0

괜찮습니다! 좋은 .. – Rohit

관련 문제