2013-04-05 6 views
2

나는 다음과 같습니다 종속성 속성을 가진 사용자 제어를 구현설정 종속성 속성은

<UserControl x:Class="Custom.MyUC" 
     x:Name="myUCName" 
     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:Custom" 
     mc:Ignorable="d" 
     TabIndex="0" KeyboardNavigation.TabNavigation="Local" 
     HorizontalContentAlignment="Left" VerticalContentAlignment="Top" 
     MouseLeftButtonDown="OnMouseLeftButtonDown"> 
    <UserControl.Style> 
     <Style TargetType="local:MyUC">  
      <Setter Property="MyBackground" Value="Black"/> 
     </Style> 
    </UserControl.Style> 

    <Border BorderThickness="0"> 
     //... 
    </Border> 
</UserControl> 

를이 컴파일하지만 애플 리케이션을 실행할 때 다음과 같은 예외가 발생합니다.

'System.Windows.Setter.Property'속성을 설정하면 예외가 발생했습니다. ' 는 행 번호 '..'라인 위치 '..'. "나는이 문제를 해결하려면 어떻게

?

당신은 TargetType =로 스타일을 적용하기 위해 노력하고 있기 때문에 문제가 발생

답변

1

" "MyUC . 형의 UserControl의 요소에

이 솔루션은 컨트롤의 외부에서 스타일을 적용하는 것입니다 예를 들어 다른 창에서 컨트롤을 사용할 때 그래서 :. 테스트로

<Window.Resources> 
    <Style TargetType="local:MyUC"> 
     <Setter Property="MyBackground" Value="Red" /> 
    </Style> 
</Window.Resources> 
<Grid> 
    <local:MyUC /> 
</Grid> 

을 나는이 추가 코드를 사용자 정의 컨트롤에 추가합니다.

public partial class MyUC 
{ 
    public MyUC() 
    { 
     InitializeComponent(); 
    } 

    public static readonly DependencyProperty MyBackgroundProperty = 
     DependencyProperty.Register("MyBackground", typeof(Brush), typeof(MyUC), 
     new PropertyMetadata(Brushes.White, PropertyChangedCallback)); 

    private static void PropertyChangedCallback(DependencyObject dependencyObject, 
     DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs) 
    { 
     ((MyUC)dependencyObject).MyBackgroundPropertyChanged(
      (Brush)dependencyPropertyChangedEventArgs.NewValue); 
    } 

    private void MyBackgroundPropertyChanged(Brush newValue) 
    { 
     Background = newValue; 
    } 

    public Brush MyBackground 
    { 
     get { return (Brush)GetValue(MyBackgroundProperty); } 
     set { SetValue(MyBackgroundProperty, value); } 
    } 
} 

컨트롤의 결과는 빨간색 배경입니다.

+1

안녕하세요 Phil, 답변 해 주셔서 감사합니다. 객체 지향적 인 다른 솔루션이 있습니까? 예를 들어, MyUC에서 관리하는 데이터의 DataTrigger에 따라 MyBackground 속성을 설정하려고합니다. 이 작업은 MyUC를 사용하는 각 응용 프로그램이 아니라 MyUC 코드 내에서 수행해야합니다. – Waterman