2013-05-21 1 views
2

표준 System.Windows.Controls.Calendar 컨트롤에서 상속되는 사용자 지정 컨트롤을 작성합니다. 코드 프로젝트에 대한이 기사를 따르고 있습니다. 또한 MSDN의이 기사 에서처럼 CalendarItem 하위 객체의 크기를 조절할 수있게하려고합니다. 바인딩을 사용하여 표준 컨트롤에서 컨트롤 템플릿을 참조하는 방법?

나는 나의 generic.xaml을에있는 내 사용자 지정 컨트롤 ResourceDictionary에로 Calendar 컨트롤의 소스 코드에서 달력, CalendarDayButton 및 CalendarItem의 스타일을 복사. 이 같은 CalendarItem 스타일 참조 3 버튼 템플릿 (이전 달, 다음 달 및 헤더 버튼) :이 바인딩은 정적 리소스를 사용하기 때문에
<!-- Start: Previous button content --> 
<Button x:Name="PART_PreviousButton" 
     Grid.Row="0" Grid.Column="0" 
     Template="{StaticResource PreviousButtonTemplate}" 
     Height="20" Width="28" 
     HorizontalAlignment="Left" 
     Focusable="False" 
     /> 
<!-- End: Previous button content --> 

<!-- Start: Header button content --> 
<Button x:Name="PART_HeaderButton"            
     Grid.Row="0" Grid.Column="1" 
     Template="{StaticResource HeaderButtonTemplate}" 
     HorizontalAlignment="Center" VerticalAlignment="Center" 
     FontWeight="Bold" FontSize="10.5" 
     Focusable="False" 
     /> 
<!-- End: Header button content --> 

<!-- Start: Next button content --> 
<Button x:Name="PART_NextButton" 
     Grid.Row="0" Grid.Column="2" 
     Height="20" Width="28" 
     HorizontalAlignment="Right" 
     Template="{StaticResource NextButtonTemplate}" 
     Focusable="False" 
     /> 
<!-- End: Next button content --> 

지금, 난 내있는 ResourceDictionary에 세 개의 버튼의 스타일을 복사해야합니다 . 이 단추를 변경하지 않으려 고합니다. 따라서 ResourceDictionary에서 스타일을 사용하는 것이 피할 수 있기를 바랍니다.

내가 바인딩을 통해이 버튼의 원래 스타일을 참조 할 수있는 방법이 있습니까?

답변

1

예, 있습니다 :

Calendar에서 상속 사용자 지정 컨트롤에

, 당신은 세 가지 스타일의 각각

public class MyCalender : Calendar 
{ 
    public static readonly DependencyProperty PreviousButtonTemplateProperty = 
     DependencyProperty.Register("PreviousButtonTemplate", typeof (ControlTemplate), typeof (MyCalender), new PropertyMetadata(default(ControlTemplate))); 

    public ControlTemplate PreviousButtonTemplate 
    { 
     get { return (ControlTemplate) GetValue(PreviousButtonTemplateProperty); } 
     set { SetValue(PreviousButtonTemplateProperty, value); } 
    } 

    // Same for other button templates 
} 

을 입력 ControlTemplate의 종속성 속성을 노출하고 내에서 이러한 스타일에 바인딩 할 수 있습니다 TemplatedParent 바인딩을 사용하는 캘린더의 경우 ControlTemplate입니다.

<ControlTemplate x:Key="MyCalender" TargetType="viewModels:MyCalendar"> 
    <Grid> 
     <Button x:Name="PART_PreviousButton" 
     Grid.Row="0" Grid.Column="0" 
     Template="{TemplateBinding Property=PreviousButtonTemplate}" 
     Height="20" Width="28" 
     HorizontalAlignment="Left" 
     Focusable="False" 
     /> 
    </Grid> 
</ControlTemplate> 

나는 다음 사용자 정의 캘린더 컨트롤의 종속성 속성에있는 버튼 템플릿 (PreviousButtonTemplate 등)에 할당 가능한 가장 높은 수준의 기본 스타일을 정의하는 것입니다. 가장 높은 수준으로, 나는 당신이 예를 app.xaml 또는 윈도우 함께 연결할 모든 템플릿이 존재하는 그 범위에있는 객체를 의미. 이, 그리고 한 컨트롤 템플릿은 런타임 중에 존재하는 참조하는 StaticResources으로, 올바르게 해결 될 것 같은

<Style TargetType="viewModels:MyCalendar"> 
    <Setter Property="PreviousButtonTemplate" Value="{StaticResource PreviousButtonTemplate}" /> 
</Style> 

양자 택일로, 당신은 그냥 둘 수 있습니다. 좋지는 않지만 디자인 타임을 지원하지 않습니다.

확인 편집, 난 당신이 '원래'버튼 템플릿을 참조했다하지 않았다, 나는 당신이 이미 다른 곳에서 정의 된 템플릿을 의미 생각했다. 다음 : 아니, 당신은 이것을 할 수 없습니다. 나는 같은 것을 여러 번 시도해 왔지만 원래 템플릿의 일부를 사용하는 컨트롤 템플릿을 만들 수는 없습니다. ControlTemplates에는 'BasedOn'과 같은 것이 없습니다.

+0

안녕하세요 마크, 즉 종속성 속성을 사용하여 매우 흥미로운 기술입니다. 그러나 나는 그것이 아무것도 해결한다고 생각하지 않는다. 귀하의 방법을 사용하여, 나는 여전히 버튼에 대한 스타일/컨트롤 템플릿을 만들 필요가있다. 그들의 바인딩은 매우 다르게 수행된다. 내가 찾고있는 것은 Controls.Calendar 컨트롤에서 이미 존재하는 템플릿을 참조하는 방법입니다. 나는 뭔가 오해 할 수도 있습니다. :) – Cousken

+1

좋아, 나는 '원래'버튼 템플릿을 언급하는 것을 얻지 못했고, 이미 다른 곳에 정의한 템플릿을 의미한다고 생각했습니다. 다음 : 아니, 당신은 이것을 할 수 없습니다. 나는 같은 것을 여러 번 시도해 왔지만 원래 템플릿의 일부를 사용하는 컨트롤 템플릿을 만들 수는 없습니다. ControlTemplates에는 'BasedOn'과 같은 것이 없습니다. – Marc

+0

Marc에게 감사드립니다. 가능한 한 많은 코드를 재사용 할 수 있다고 믿습니다. 그래서 나는 그러한 가능성을 매우 좋아할 것입니다. – Cousken

관련 문제