2012-11-12 4 views
0

이미 물어 보려했지만 이미 충분한 정보를 제공하지 못했을 것입니다. 내 자신의 WPF 테마를 만들려고합니다. 이 스타일을 만들 때까지 모든 것이 괜찮 았습니다.TextBox 스타일의 SolidColorBrush가 변경되었습니다.

<Style TargetType="{x:Type TextBox}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type TextBox}"> 
       <Grid> 
        <VisualStateManager.VisualStateGroups> 
         <VisualStateGroup x:Name="CommonStates"> 
          <VisualState x:Name="Normal"/> 
          <VisualState x:Name="Disabled"> 
           <Storyboard> 
            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="PART_ContentHost"> 
             <EasingDoubleKeyFrame KeyTime="0" Value="0.5"/> 
            </DoubleAnimationUsingKeyFrames> 
            <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)" Storyboard.TargetName="Background"> 
             <EasingColorKeyFrame KeyTime="0" Value="Red"/> 
            </ColorAnimationUsingKeyFrames> 
            <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Shape.Stroke).(SolidColorBrush.Color)" Storyboard.TargetName="Background"> 
             <EasingColorKeyFrame KeyTime="0" Value="Yellow"/> 
            </ColorAnimationUsingKeyFrames> 
           </Storyboard> 
          </VisualState> 
          <VisualState x:Name="ReadOnly"/> 
          <VisualState x:Name="MouseOver"/> 
         </VisualStateGroup> 
        </VisualStateManager.VisualStateGroups> 
        <Rectangle x:Name="Background" Fill="{StaticResource OniiControlBackgroundBrush}" Stroke="{StaticResource OniiNormalBrush}" RadiusX="2" RadiusY="2"/> 
        <ScrollViewer x:Name="PART_ContentHost" Margin="2" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" FontFamily="{TemplateBinding FontFamily}"/> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    <Setter Property="Foreground" Value="Black"/> 
    <Setter Property="SnapsToDevicePixels" Value="True"/> 
</Style> 

TextBox가 사용 중지 된 경우 TextBox 배경 및 BorderBrush의 색상을 변경해야합니다.

색상은

<Color x:Key="MainColor">#FF595959</Color> 
<Color x:Key="OniiControlBackgroundColor">#FF333333</Color> 

<SolidColorBrush x:Key="OniiNormalBrush" Color="{StaticResource MainColor}"/> 
<SolidColorBrush x:Key="OniiControlBackgroundBrush" Color="{StaticResource OniiControlBackgroundColor}" /> 

이 정말 내 문제가 무엇인지 모르겠다 같은 ResourceDictionary에 정의되어있다. 내가 알고있는 무엇 :

/

    OniiControlBackgroundBrush가 정적 리소스로 다른 스타일에서 참조
"텍스트 상자 없게되면, 레드 컬러에 OniiControlBackgroundBrush 사용하는 것 모두의 색상을 변경"1

2/"그 색상을 전환해도 OniiControlBackgroundBrush 만 변경되지만 이번에는 노란색으로 변경됩니다"

,210
<Rectangle x:Name="Background" Fill="{StaticResource OniiNormalBrush}" Stroke="{StaticResource OniiControlBackgroundBrush}" RadiusX="2" RadiusY="2"/> 
  • OniiNormalBrush는

3/

<Application.Resources> 
    <ResourceDictionary Source="Theme/OniiResourceDictionary.xaml"> 
    </ResourceDictionary> 
</Application.Resources> 

(4)/"이 재현 시도"모든이 하나의 리소스 사전에 정의 된 "정적 리소스로 다른 스타일에서 참조 더 적은 사용자 정의 스타일로 더 작은 솔루션에서 문제가 발생했지만 성공하지 못했습니다. "

  • 동일한 TextBox 스타일을 사용했습니다.

    <TextBox Height="32" HorizontalAlignment="Left" Margin="38,51,0,0" Name="textBox1" VerticalAlignment="Top" Width="215" /> 
    <CheckBox Content="Enabled" Height="16" HorizontalAlignment="Left" Margin="259,51,0,0" Name="checkBox1" VerticalAlignment="Top" Checked="checkBox1_Checked" Unchecked="checkBox1_Unchecked" /> 
    <Border Height="148" HorizontalAlignment="Left" Margin="254,126,0,0" Name="border1" VerticalAlignment="Top" Width="98" /> 
    <Rectangle Fill="{StaticResource OniiNormalBrush}" StrokeThickness="20" Stroke="{StaticResource OniiControlBackgroundBrush}" Height="148" HorizontalAlignment="Left" Margin="358,126,0,0" Name="rectangle5" VerticalAlignment="Top" Width="99" /> 
    
  • 텍스트 상자가 사용 안 함 확인란에 의해 활성화되어, 테두리 StaticResources으로 두 색상으로 사용자 정의 스타일을 사용

5/"나는 내 원래의 솔루션 문제에 다음 코드를 추가 할 때이 없어"

<Rectangle Height="71" HorizontalAlignment="Left" Margin="130,131,0,0" Name="rectangle2" StrokeThickness="20" Stroke="{StaticResource OniiControlBackgroundBrush}" Fill="{StaticResource OniiNormalBrush}" VerticalAlignment="Top" Width="98" /> 

정말 실종 됐나요? 아니면 내가 정말 바보 야? 어쨌든 귀하의 도움을 주시면 감사하겠습니다. 나는 정말로 길을 잃었다. x : Shared = "false"는 주로 OniiNormalBrush를 변경해도 문제가 없기 때문에 사용하지 않으려합니다. 고맙습니다.

답변

1

문제는 리소스 바인딩에있는 것으로 보입니다. StaticResource를 사용하면 윈도우가 초기화 될 때 리소스가로드 된 다음 다시로드되지 않습니다. 따라서 대부분의 경우 리소스를 수정할 때 바인딩 된 컨트롤은 변경 내용을 인식하지 못합니다.

# 4에서 런타임에 리소스를 업데이트 할 수있는 DynamicResource를 사용 했으므로이 문제가 발생하지 않았습니다.

편집 : 두 번째로 볼 때 두 번째 일 수있는 것처럼 보입니다.

하나 .. 색상의 정적 바인딩이 업데이트를 허용하지 않습니다. 브러시에 Color를 바인딩 할 때 정적에서 동적으로 변경하는 것이 문제를 해결합니까?

<Color x:Key="MainColor">#FF595959</Color> 
<Color x:Key="OniiControlBackgroundColor">#FF333333</Color> 

<SolidColorBrush x:Key="OniiNormalBrush" Color="{DynamicResource MainColor}"/> 
<SolidColorBrush x:Key="OniiControlBackgroundBrush" Color="{DynamicResource OniiControlBackgroundColor}" /> 

... 애니메이션은 본질적으로 할당 직접 색상을 갖는 의해 결합되어 청소 브러시의 색상 .. 설정된다. 나는 애니메이션이 끝나면 색깔이 구속력으로 되돌아 갈 것이라고 생각했을 것이다. 그러나 이것이 사실이 아닐 수도있다. 이것은 어떤 영향을 미치나요?

<SolidColorBrush x:Key="OniiNormalBrush" Color="#FF595959"/> 
<SolidColorBrush x:Key="OniiControlBackgroundBrush" Color="#FF333333" /> 
+0

텍스트 상자의 색상을 변경하는 데 문제가 없습니다 ... 브러시의 색상 OniiControlBackgroundBrush가 어디에서나 변경됩니다. 나는 그것을 원하지 않는다. # 4에서는 브러시를 StaticResource로 참조 할 때 문제가없는 것 같습니다. –

+0

맞아요,하지만 위 예제에서는 브러시의 색상을 정적으로 바인딩하고 있습니다. 색상 = "{StaticResource MainColor}". 나는 당신의 낮은 예에서 이것을하지 않는다고 생각합니다. 리소스는 객체에 대한 참조를 제공합니다. 색상의 경우 새 색상을 넣으면 참조가 변경되고 정적으로 참조 된 항목은 업데이트되지 않지만 dynamicResource 참조는 새 색상으로 표시됩니다. 또한 x : Shared의 기본값은 true이므로 수동으로 true로 설정하면 추가 효과가 없습니다. –

+0

네, 그게 문제입니다. StaticResource로 도처에서 참조 된 두 브러쉬가 있습니다. 그래서 나는 그들이 변화하기를 기대하지 않는다. 최악의 문제는 그 브러시 중 하나가 예상되는 위치에서 업데이트되고 두 번째는 업데이트 된 곳에서 업데이트된다는 것입니다. x : Shared = "true"가 엉망이되어서 죄송합니다. 내가 멘션 한 것은 x : Shared = "false"그리고 이번에는 StaticResource를 사용한 # 4도 편집했습니다. 여전히 같은 결과. 하나의 색상은 어디서나 업데이트되고 두 번째 색상은 업데이트 된 위치에서만 업데이트됩니다. –