2013-01-03 3 views
3

기본 클래스 UserControl에서 사용자 지정 컨트롤 (본인)을 만들었으므로 앞으로 컨트롤을 만들 때 상속하지 못하게되었습니다. 나는이 사용자 지정 컨트롤에서 상속 할 때사용자 지정 컨트롤에서 상속

public class LoadOverlayUserControl : UserControl 
{ 
    static LoadOverlayUserControl() 
    { 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(LoadOverlayUserControl), new FrameworkPropertyMetadata(typeof(LoadOverlayUserControl))); 
    } 

    #region Overlay Visibility 
    public static readonly DependencyProperty OverlayVisibilityProperty = DependencyProperty.Register("OverlayVisibility", 
     typeof(Visibility), 
     typeof(LoadOverlayUserControl), 
     new PropertyMetadata(Visibility.Hidden)); 

    private Visibility OverlayVisibility 
    { 
     get 
     { 
      return (Visibility)this.GetValue(OverlayVisibilityProperty); 
     } 
     set 
     { 
      this.SetValue(OverlayVisibilityProperty, value); 
     } 
    } 
    #endregion 

    #region Overlay Color 
    public static readonly DependencyProperty OverlayColorProperty = DependencyProperty.Register("OverlayColor", 
     typeof(Color), 
     typeof(LoadOverlayUserControl), 
     new PropertyMetadata(Color.FromRgb(0,0,0))); 

    public Color OverlayColor 
    { 
     get 
     { 
      return (Color)this.GetValue(OverlayColorProperty); 
     } 
     set 
     { 
      this.SetValue(OverlayColorProperty, value); 
     } 
    } 
    #endregion 

    public void SetLoading(bool IsLoading) 
    { 
     if (IsLoading) 
     { 
      OverlayVisibility = System.Windows.Visibility.Visible; 
     } 
     else 
     { 
      OverlayVisibility = System.Windows.Visibility.Hidden; 
     } 
    } 
} 

, 그것은 보인다 내가으로 실행했습니다 문제가된다 : 여기

는 소스 코드를 사용자 정의 컨트롤 템플릿 여기

<Style TargetType="{x:Type local:LoadOverlayUserControl}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type local:LoadOverlayUserControl}"> 
       <Grid> 
        <ContentPresenter Content="{TemplateBinding ContentControl.Content}" ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}"/> 
        <Border Visibility="{TemplateBinding OverlayVisibility}" 
          Background="{TemplateBinding OverlayColor}" 
          BorderBrush="{TemplateBinding BorderBrush}" 
          BorderThickness="{TemplateBinding BorderThickness}"> 
         <dxe:ProgressBarEdit /> 
        </Border> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

입니다 내 템플릿을 무시하고 빈 컨트롤로 끝납니다.

다음은이 사용자 지정 컨트롤에서 상속 된 새 컨트롤의 예입니다.

<custom:LoadOverlayUserControl x:Class "ChildControl" 
... 
... 
...> 

<UserControl.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="../ResourceDictionaries/Generic.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</UserControl.Resources> 

<Grid> 
... 
</Grid> 
</custom:LoadOverlayUserControl> 

다음은 새 컨트롤을 사용하는 방법입니다. 나는 가독성을 위해 네임 스페이스를 생략했지만, 내가해야 할 일이 까다로운 것이 없다면 네임 스페이스가 정확하다는 것을 확신한다.

<UserControl x:Class "SomeOtherControl"> 
    <Grid> 
    <StackPanel> 
     <my:ChildControl /> 
    </StackPanel> 
    </Grid> 
</UserControl> 

사용자 지정 컨트롤 뒤에 아이디어는 내가 반투명 불투명도의 상단에 "현재로드"오버레이를 적용 할 수 있도록하려면 컨트롤을위한 것입니다.

+2

[FAQ] –

+1

이 질문에 대한 대답을 쓰려고 생각했지만 그 다음에 나는 –

+0

다음 번에는 질문을 작성하기 전에 게시하지 않도록하십시오. downvotes의 무리를지고. –

답변

2

WPF에서 사용자 지정 컨트롤을 만들려면 다르게해야 할 일이 있습니다.

처음에는 ContentControl이 아니라 UserControl을 상속합니다.

둘째, 리소스 사전 Generic.xaml이 Themes 폴더 아래에 있어야합니다.

세 번째로 파생 컨트롤 클래스도 WPF 컨트롤이어야합니다. 즉, 기본 스타일 키를 대체하고 Generic.xaml에서 스타일을 정의해야합니다.

관련 문제