سؤال

لدي السيناريو التالي:

[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 ضروري لوحة لأي inputbox. إنها بسيطة الآن، ولكن سيتم إعادة استخدامها في جميع أنحاء التطبيق، وسوف تحتوي على معلومات وتخطيط أكثر تعقيدا.

TextBox كمدخلات يجب استخدامه، لذلك أقوم بإجراء هذا التحكم:

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

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

ثم لدي ذلك العام الحالي.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 تستخدم أكثر مع مربع نصي، فأنا أرغب في إجراء عنصر تحكم بهذا، مما يعزيه نفس القالب، لذلك لا أحتاج إلى نسخ / لصق القالب، ولديه رأس الحفاظ على حد سواء مع نفسه التغييرات.

كيف يمكنني إعادة استخدام ValueBoxWithLabeltemplate وتجاوز خاصية المحتوى فقط مع الحفاظ على بقية القالب؟

هل كانت مفيدة؟

المحلول

إنه نهج مثير للاهتمام. لم أحاول ذلك بنفسي ولكن يبدو أن النهج قد يعمل.

المشكلة التي لديك حاليا هل تحاول استخدام Content خاصية ContentPresenter. وبعد ومع ذلك، يتطلب أن يتم تعيين مثيل ملموس لمراقبة أي شيء في هذه الحالة TextBox. وبعد لا يمكنك استخدام TemplateBinding في ال TextBox لأنه ليس جزءا من 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