আমারও একই সমস্যা ছিল এবং আমি একটি সমাধান নিয়ে এসেছি। সমাধান করার পরে আমি এই প্রশ্নটি পেয়েছি এবং আমি দেখতে পাচ্ছি যে আমার সমাধানটি মার্কের সাথে অনেকটা মিল রয়েছে। তবে এই পদ্ধতিটি কিছুটা আলাদা।
প্রধান সমস্যাটি হ'ল আচরণ এবং ট্রিগারগুলি একটি নির্দিষ্ট অবজেক্টের সাথে যুক্ত হয় এবং তাই আপনি একাধিক বিভিন্ন সম্পর্কিত বস্তুর জন্য আচরণের একই উদাহরণ ব্যবহার করতে পারবেন না। আপনি যখন নিজের আচরণটিকে ইনলাইনটি সংজ্ঞায়িত করেন এক্সএএমএল এই ওয়ান-টু ওয়ান সম্পর্ককে কার্যকর করে। যাইহোক, আপনি যখন কোনও স্টাইলে কোনও আচরণ সেট করার চেষ্টা করেন, তখন স্টাইলটি প্রয়োগ করা সমস্ত বস্তুর জন্য আবার ব্যবহার করা যেতে পারে এবং এটি বেস আচরণ শ্রেণীর ক্ষেত্রে ব্যতিক্রম ছুঁড়ে দেয়। প্রকৃতপক্ষে লেখকরা আমাদের এটি করার চেষ্টা থেকে বিরত রাখতে যথেষ্ট প্রচেষ্টা করেছিলেন, এটা জেনেও যে এটি কার্যকর হবে না।
প্রথম সমস্যাটি হ'ল আমরা এমনকি কোনও আচরণ সেটার মানও তৈরি করতে পারি না কারণ নির্মাতা অভ্যন্তরীণ। সুতরাং আমাদের নিজস্ব আচরণ এবং ট্রিগার সংগ্রহের ক্লাসগুলির প্রয়োজন।
পরবর্তী সমস্যাটি হ'ল আচরণ এবং ট্রিগার সংযুক্ত বৈশিষ্ট্যের সেটটার নেই এবং তাই এগুলি কেবল ইন-লাইন এক্সএএমএলএল যুক্ত করা যেতে পারে। এই সমস্যাটি আমরা আমাদের নিজস্ব সংযুক্ত বৈশিষ্ট্যগুলির সাথে সমাধান করি যা প্রাথমিক আচরণ এবং ট্রিগার বৈশিষ্ট্যগুলিতে হেরফের করে।
তৃতীয় সমস্যাটি হ'ল আমাদের আচরণ সংগ্রহটি কেবলমাত্র একক শৈলীর টার্গেটের জন্য ভাল। এটি আমরা সামান্য ব্যবহৃত এক্সএএমএল বৈশিষ্ট্যটি ব্যবহার করে সমাধান করি x:Shared="False"
যা প্রতিবারের সাথে সম্পর্কিত হওয়ার সাথে সাথে এটির একটি নতুন অনুলিপি তৈরি করে।
চূড়ান্ত সমস্যাটি হ'ল আচরণ এবং ট্রিগারগুলি অন্য স্টাইল সেটারের মতো নয়; আমরা পুরানো আচরণগুলিকে নতুন আচরণের সাথে প্রতিস্থাপন করতে চাই না কারণ তারা বুনোভাবে বিভিন্ন কাজ করতে পারে। সুতরাং আমরা যদি স্বীকার করি যে একবার আপনি কোনও আচরণ যুক্ত করলে আপনি তা এড়াতে পারবেন না (এবং এটি বর্তমানে আচরণগুলি আচরণ করে) তবে আমরা উপসংহারে পৌঁছাতে পারি যে আচরণগুলি এবং ট্রিগারগুলি যুক্ত হওয়া উচিত এবং এটি আমাদের সংযুক্ত বৈশিষ্ট্যগুলি দ্বারা পরিচালনা করা যেতে পারে।
এই পদ্ধতির ব্যবহার করে এখানে একটি নমুনা দেওয়া হল:
<Grid>
<Grid.Resources>
<sys:String x:Key="stringResource1">stringResource1</sys:String>
<local:Triggers x:Key="debugTriggers" x:Shared="False">
<i:EventTrigger EventName="MouseLeftButtonDown">
<local:DebugAction Message="DataContext: {0}" MessageParameter="{Binding}"/>
<local:DebugAction Message="ElementName: {0}" MessageParameter="{Binding Text, ElementName=textBlock2}"/>
<local:DebugAction Message="Mentor: {0}" MessageParameter="{Binding Text, RelativeSource={RelativeSource AncestorType={x:Type FrameworkElement}}}"/>
</i:EventTrigger>
</local:Triggers>
<Style x:Key="debugBehavior" TargetType="FrameworkElement">
<Setter Property="local:SupplementaryInteraction.Triggers" Value="{StaticResource debugTriggers}"/>
</Style>
</Grid.Resources>
<StackPanel DataContext="{StaticResource stringResource1}">
<TextBlock Name="textBlock1" Text="textBlock1" Style="{StaticResource debugBehavior}"/>
<TextBlock Name="textBlock2" Text="textBlock2" Style="{StaticResource debugBehavior}"/>
<TextBlock Name="textBlock3" Text="textBlock3" Style="{StaticResource debugBehavior}"/>
</StackPanel>
</Grid>
উদাহরণটি ট্রিগার ব্যবহার করে তবে আচরণগুলি একইভাবে কাজ করে। উদাহরণস্বরূপ, আমরা দেখাই:
- শৈলীটি একাধিক পাঠ্য ব্লকে প্রয়োগ করা যেতে পারে
- বিভিন্ন ধরণের ডেটা বাঁধাই সমস্ত কাজ সঠিকভাবে করে
- একটি ডিবাগ ক্রিয়া যা আউটপুট উইন্ডোটিতে পাঠ্য উত্পন্ন করে
এখানে একটি উদাহরণ আচরণ, আমাদের DebugAction
। আরও সঠিকভাবে এটি একটি ক্রিয়া তবে ভাষার অপব্যবহারের মাধ্যমে আমরা আচরণ, ট্রিগার এবং ক্রিয়াকলাপগুলিকে "আচরণ" বলি।
public class DebugAction : TriggerAction<DependencyObject>
{
public string Message
{
get { return (string)GetValue(MessageProperty); }
set { SetValue(MessageProperty, value); }
}
public static readonly DependencyProperty MessageProperty =
DependencyProperty.Register("Message", typeof(string), typeof(DebugAction), new UIPropertyMetadata(""));
public object MessageParameter
{
get { return (object)GetValue(MessageParameterProperty); }
set { SetValue(MessageParameterProperty, value); }
}
public static readonly DependencyProperty MessageParameterProperty =
DependencyProperty.Register("MessageParameter", typeof(object), typeof(DebugAction), new UIPropertyMetadata(null));
protected override void Invoke(object parameter)
{
Debug.WriteLine(Message, MessageParameter, AssociatedObject, parameter);
}
}
পরিশেষে, আমাদের সংগ্রহ এবং সংযুক্ত বৈশিষ্ট্যগুলি এগুলি সমস্ত কাজ করে। এর সাথে সাদৃশ্য করে Interaction.Behaviors
, আপনি যে সম্পত্তিটিকে লক্ষ্যবস্তু করা হয় তাকে ডাকা হয় SupplementaryInteraction.Behaviors
কারণ এই সম্পত্তিটি সেট করার মাধ্যমে আপনি Interaction.Behaviors
ট্রিগারগুলির সাথে আচরণগুলি এবং তেমনিভাবে যুক্ত করবেন।
public class Behaviors : List<Behavior>
{
}
public class Triggers : List<TriggerBase>
{
}
public static class SupplementaryInteraction
{
public static Behaviors GetBehaviors(DependencyObject obj)
{
return (Behaviors)obj.GetValue(BehaviorsProperty);
}
public static void SetBehaviors(DependencyObject obj, Behaviors value)
{
obj.SetValue(BehaviorsProperty, value);
}
public static readonly DependencyProperty BehaviorsProperty =
DependencyProperty.RegisterAttached("Behaviors", typeof(Behaviors), typeof(SupplementaryInteraction), new UIPropertyMetadata(null, OnPropertyBehaviorsChanged));
private static void OnPropertyBehaviorsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var behaviors = Interaction.GetBehaviors(d);
foreach (var behavior in e.NewValue as Behaviors) behaviors.Add(behavior);
}
public static Triggers GetTriggers(DependencyObject obj)
{
return (Triggers)obj.GetValue(TriggersProperty);
}
public static void SetTriggers(DependencyObject obj, Triggers value)
{
obj.SetValue(TriggersProperty, value);
}
public static readonly DependencyProperty TriggersProperty =
DependencyProperty.RegisterAttached("Triggers", typeof(Triggers), typeof(SupplementaryInteraction), new UIPropertyMetadata(null, OnPropertyTriggersChanged));
private static void OnPropertyTriggersChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var triggers = Interaction.GetTriggers(d);
foreach (var trigger in e.NewValue as Triggers) triggers.Add(trigger);
}
}
এবং সেখানে আপনার এটি রয়েছে, সম্পূর্ণ-কার্যকরী আচরণ এবং শৈলীর মাধ্যমে প্রয়োগ করা ট্রিগারগুলি।