الفضة الميراث مخصص مخصص. إعادة استخدام القالب؟
-
20-09-2019 - |
سؤال
لدي السيناريو التالي:
[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
للمساعدة في تجاوز العقارات من السيطرة الخارجي إلى واحدة الداخلية. كلاهما حقيقي القبيح.
خاتمة
لمثل هذا القالب الأساسي بسيطة، فمن المحتمل أن تكون أفضل حالا في تكرار القالب من القفز من خلال جميع الأطواق اللازمة لتحقيق بعض أنواع إعادة الاستخدام.