문제

다음 시나리오가 있습니다.

[TemplatePart(Name = GoToEditModeButtonPart, Type = typeof(DoubleClickButton))]
public class ValueBoxWithLabel : ContentControl
{
    public const string GoToEditModeButtonPart = "GoToEditModeButtonPart";

    #region LabelText Dependency Property ...

    #region IsInEditMode Dependency Property ...

    public event EventHandler<ModeChangedEventArgs> ModeChanged;

    public ValueBoxWithLabel()
    {
        DefaultStyleKey = typeof (ValueBoxWithLabel);
    }

    public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();

        //IsInEditMode invokes ModeChanged in the dependency property
        ((DoubleClickButton) GetTemplateChild(GoToEditModeButtonPart)).DoubleClick += (sender, args) => IsInEditMode = true;
    }

    private void InvokeModeChanged(ModeChangedEventArgs e)
    {
        EventHandler<ModeChangedEventArgs> mode = ModeChanged;
        if (mode != null)
            mode(this, e);
    }
}

ValueBox는 모든 입력 상자에 필수적인 패널입니다. 지금은 간단하지만 응용 프로그램 전체에서 재사용되며 더 복잡한 동작 및 레이아웃이 포함됩니다.

입력으로 텍스트 상자는 반드시 사용해야 하므로이 제어를합니다.

public class TextBoxWithLabel : ValueBoxWithLabel
{
    #region Text Dependency Property ...

    public TextBoxWithLabel()
    {
        DefaultStyleKey = typeof (TextBoxWithLabel);
    }
}

그런 다음 현재 generic.xaml이 작동하지 않지만 제가 원하는 것에 대한 아이디어를 제공합니다.

<ResourceDictionary>

<ControlTemplate x:Key="ValueBoxWithLabelTemplate">
    <StackPanel Style="{StaticResource ValueBoxWithLabelPanelStyle}">
        <TextBlock Style="{StaticResource LabelStyle}" Text="{TemplateBinding LabelText}" />
        <Grid>
            <ContentPresenter Content="{TemplateBinding Content}" />
            <local:DoubleClickButton Background="Black" x:Name="GoToEditModeButtonPart"></local:DoubleClickButton>
        </Grid>
    </StackPanel>
</ControlTemplate>

<Style TargetType="local:ValueBoxWithLabel">
    <Setter Property="Template" Value="{StaticResource ValueBoxWithLabelTemplate}" />
</Style>

<Style TargetType="local:TextBoxWithLabel">
    <Setter Property="Template" Value="{StaticResource ValueBoxWithLabelTemplate}" />
    <Setter Property="Content">
        <Setter.Value>
            <TextBox Style="{StaticResource ValueBoxStyle}" Text="{TemplateBinding Text}" />
        </Setter.Value>
    </Setter>
</Style>

ValueBoxWithLabel은 텍스트 상자와 함께 가장 많이 사용되므로 동일한 템플릿을 재사용하는 컨트롤을 만들고 싶습니다. 따라서 템플릿을 복사/붙여 넣을 필요가 없으며 동일하게 최신 상태를 유지할 필요가 없습니다. 변화.

valuebox를 재사용하여 Labeltemplate을 재사용하고 나머지 템플릿을 유지하는 컨텐츠 속성 만 무시할 수 있습니까?

도움이 되었습니까?

해결책

흥미로운 접근법입니다. 나는 그것을 직접 시도하지 않았지만 접근 방식이 작동하는 것처럼 보입니다.

현재 가지고있는 문제는 Content 의 속성 ContentPresenter. 그러나이 경우에 당신이 TextBox. 당신은 사용할 수 없습니다 TemplateBinding 에서 TextBox 그것은 a의 일부가 아니기 때문입니다 ControlTemplate.

없이도 TemplateBinding 문제는 어쨌든 하나의 컨트롤 만 만들 수 있습니다. TextBox 둘 이상의 장소에서. 그렇기 때문에 우리는 템플릿이 먼저 있습니다.

끝까지 템플릿

템플릿 문제를 해결하는 것이 그리 어렵지 않아야합니다. 실제로 속임수는 특수 제어의 내부 컨텐츠 제어를 특수 클래스의 속성에 바인딩하는 방법을 찾는 것입니다. 사용할 수 없을 때는 어렵습니다 TemplateBinding.

먼저 컨트롤 렌더링을 얻기 위해 최소한 변경해야 할 변경 사항을 설명합니다.

<ControlTemplate x:Key="ValueBoxWithLabelTemplate">
    <StackPanel Style="{StaticResource ValueBoxWithLabelPanelStyle}">
        <TextBlock Style="{StaticResource LabelStyle}" Text="{TemplateBinding LabelText}" />
        <Grid>
            <ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}" />
            <local:DoubleClickButton Background="Black" x:Name="GoToEditModeButtonPart"></local:DoubleClickButton>
        </Grid>
    </StackPanel>
</ControlTemplate>

그만큼 TextBoxWithLabel :--

<Style TargetType="local:TextBoxWithLabel">
    <Setter Property="Template" Value="{StaticResource ValueBoxWithLabelTemplate}" />
    <Setter Property="ContentTemplate">
        <Setter.Value>
            <DataTemplate>
                <TextBox Style="{StaticResource ValueBoxStyle}"  />
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>

이것은 (테스트하지 않고) 렌더링 할 것이라고 생각합니다.

바인딩 문제

그러나 당신이 바인딩을 볼 수 있듯이 Text 속성이 누락되었습니다. 이제 내가 생각할 수있는 몇 가지가 있습니다. DataContext 또는 하위 클래스 생성 ContentPresenter 외부 제어에서 내부로 통과하는 속성을 돕기 위해. 둘 다 정말 못 생겼다.

결론

이러한 간단한 기본 템플릿의 경우 어떤 종류의 재사용을 달성하는 데 필요한 모든 후프를 뛰어 넘는 것보다 템플릿을 복제하는 것이 좋습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top