স্টাইল সেটারে কীভাবে ব্লেন্ড বিহেভিয়ার যুক্ত করা যায়


88

আমি বোতামের জন্য মিশ্রিত আচরণটি সংশোধন করেছি। আমি কীভাবে এটিকে অ্যাপ্লিকেশনটিতে আমার সমস্ত বোতামে সেট করতে পারি।

<Button ...>
  <i:Interaction.Behaviors>
    <local:MyBehavior />
  </i:Interaction.Behaviors>
</Button>

তবে, আমি যখন চেষ্টা করি:

<Style>
  <Setter Property="i:Interaction.Behaviors">
    <Setter.Value>
      <local:MyBehavior />
    </Setter.Value>
  </Setter>
</Style>

আমি ত্রুটি পেয়েছি

সম্পত্তি "আচরণ" এর কোনও অ্যাক্সেসযোগ্য সেটার নেই।

উত্তর:


76

আমারও একই সমস্যা ছিল এবং আমি একটি সমাধান নিয়ে এসেছি। সমাধান করার পরে আমি এই প্রশ্নটি পেয়েছি এবং আমি দেখতে পাচ্ছি যে আমার সমাধানটি মার্কের সাথে অনেকটা মিল রয়েছে। তবে এই পদ্ধতিটি কিছুটা আলাদা।

প্রধান সমস্যাটি হ'ল আচরণ এবং ট্রিগারগুলি একটি নির্দিষ্ট অবজেক্টের সাথে যুক্ত হয় এবং তাই আপনি একাধিক বিভিন্ন সম্পর্কিত বস্তুর জন্য আচরণের একই উদাহরণ ব্যবহার করতে পারবেন না। আপনি যখন নিজের আচরণটিকে ইনলাইনটি সংজ্ঞায়িত করেন এক্সএএমএল এই ওয়ান-টু ওয়ান সম্পর্ককে কার্যকর করে। যাইহোক, আপনি যখন কোনও স্টাইলে কোনও আচরণ সেট করার চেষ্টা করেন, তখন স্টাইলটি প্রয়োগ করা সমস্ত বস্তুর জন্য আবার ব্যবহার করা যেতে পারে এবং এটি বেস আচরণ শ্রেণীর ক্ষেত্রে ব্যতিক্রম ছুঁড়ে দেয়। প্রকৃতপক্ষে লেখকরা আমাদের এটি করার চেষ্টা থেকে বিরত রাখতে যথেষ্ট প্রচেষ্টা করেছিলেন, এটা জেনেও যে এটি কার্যকর হবে না।

প্রথম সমস্যাটি হ'ল আমরা এমনকি কোনও আচরণ সেটার মানও তৈরি করতে পারি না কারণ নির্মাতা অভ্যন্তরীণ। সুতরাং আমাদের নিজস্ব আচরণ এবং ট্রিগার সংগ্রহের ক্লাসগুলির প্রয়োজন।

পরবর্তী সমস্যাটি হ'ল আচরণ এবং ট্রিগার সংযুক্ত বৈশিষ্ট্যের সেটটার নেই এবং তাই এগুলি কেবল ইন-লাইন এক্সএএমএলএল যুক্ত করা যেতে পারে। এই সমস্যাটি আমরা আমাদের নিজস্ব সংযুক্ত বৈশিষ্ট্যগুলির সাথে সমাধান করি যা প্রাথমিক আচরণ এবং ট্রিগার বৈশিষ্ট্যগুলিতে হেরফের করে।

তৃতীয় সমস্যাটি হ'ল আমাদের আচরণ সংগ্রহটি কেবলমাত্র একক শৈলীর টার্গেটের জন্য ভাল। এটি আমরা সামান্য ব্যবহৃত এক্সএএমএল বৈশিষ্ট্যটি ব্যবহার করে সমাধান করি 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);
    }
}

এবং সেখানে আপনার এটি রয়েছে, সম্পূর্ণ-কার্যকরী আচরণ এবং শৈলীর মাধ্যমে প্রয়োগ করা ট্রিগারগুলি।


দুর্দান্ত জিনিস, এটি সুন্দরভাবে কাজ করে। আমি লক্ষ্য করেছি যে আপনি যদি স্টাইলটি রাখেন, উদাহরণস্বরূপ, ইউজারকন্ট্রোল সংস্থানগুলিতে, তবে e.NewValue প্রথমে শূন্য হতে পারে (ব্যবহৃত নিয়ন্ত্রণের উপর নির্ভর করতে পারে - আমি এটি ইনফ্রাজিস্টিক্স এক্সডাডাটাট্রি-তে XamDataTreeNodeControl এ ব্যবহার করছি)। সুতরাং আমি অনপ্রাটি ট্রাইগার্সে পরিবর্তিত কিছুটা স্যানিটি চেক যোগ করেছি: যদি (e.NewValue! = নাল)
মেটালমাইকস্টার

অন্তর্নিহিত স্টাইলে সেটার প্রয়োগ করার সময় কি এই পদ্ধতির সাথে কারও সমস্যা হয়েছে ? আমি এটি একটি অন্তর্নিহিত শৈলীতে (কী দিয়ে একটি) দারুণভাবে কাজ করতে পেরেছি, তবে আমি একটি চক্রীয় রেফারেন্স ব্যতিক্রম পাই যদি এটি কোনও অন্তর্নিহিত শৈলীতে হয়।
জেসন ফ্রাঙ্ক

4
দুর্দান্ত সমাধান, তবে দুর্ভাগ্যক্রমে এটি উইনআরটি তে কাজ করে না, কারণ x: এই প্ল্যাটফর্মে ভাগ করা নেই ...
টমাস লেভস্ক

4
আমি নিশ্চিত করতে পারি যে এই সমাধানটি কাজ করে। এটি ভাগ করে নেওয়ার জন্য আপনাকে অনেক ধন্যবাদ। যদিও আমি এটি অন্তর্নিহিত শৈলীতে এখনও চেষ্টা করি নি।
গোলভেলিয়াস

4
@ জেসন ফ্র্যাঙ্ক, ধন্যবাদ, অন্যের জন্য যেমন উল্লেখ রয়েছে ... আমি এটিকে উভয় ক্ষেত্রেই কার্যকর করে তুলেছি: সুস্পষ্ট এবং সুস্পষ্ট। আসলে আমি একটি প্রশ্ন জিজ্ঞাসা করি যেখানে আমি আমার কোডগুলি অন্যদের সহায়তা করার জন্য রেখেছিলাম তবে কেউ অনুমান করে যে আমার প্রশ্নটি নকল ছিল। আমি যা কিছু পেয়েছি তা দিয়ে আমি নিজের প্রশ্নের উত্তর দিতে পারি না। আমি মনে করি আমি বেশ সুন্দর জিনিস আবিষ্কার করেছি। :-( ... আমি আশা করি এটি খুব ঘন ঘন ঘটে না কারণ আচরণটি অন্যান্য ব্যবহারকারীদের দরকারী তথ্য থেকে বঞ্চিত করে
ফেলেছে

27

শৈলীর উত্তরগুলি এবং এই দুর্দান্ত নিবন্ধটি মিশ্রণমূলক আচরণগুলি মিশ্রণ করুন , আমি এই জেনেরিক সংক্ষিপ্ত এবং দৃ in ় সমাধানে এসেছি:

আমি জেনেরিক ক্লাস করেছি, যা কোনও আচরণের মাধ্যমে উত্তরাধিকার সূত্রে প্রাপ্ত হতে পারে।

public class AttachableForStyleBehavior<TComponent, TBehavior> : Behavior<TComponent>
        where TComponent : System.Windows.DependencyObject
        where TBehavior : AttachableForStyleBehavior<TComponent, TBehavior> , new ()
    {
        public static DependencyProperty IsEnabledForStyleProperty =
            DependencyProperty.RegisterAttached("IsEnabledForStyle", typeof(bool),
            typeof(AttachableForStyleBehavior<TComponent, TBehavior>), new FrameworkPropertyMetadata(false, OnIsEnabledForStyleChanged)); 

        public bool IsEnabledForStyle
        {
            get { return (bool)GetValue(IsEnabledForStyleProperty); }
            set { SetValue(IsEnabledForStyleProperty, value); }
        }

        private static void OnIsEnabledForStyleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            UIElement uie = d as UIElement;

            if (uie != null)
            {
                var behColl = Interaction.GetBehaviors(uie);
                var existingBehavior = behColl.FirstOrDefault(b => b.GetType() ==
                      typeof(TBehavior)) as TBehavior;

                if ((bool)e.NewValue == false && existingBehavior != null)
                {
                    behColl.Remove(existingBehavior);
                }

                else if ((bool)e.NewValue == true && existingBehavior == null)
                {
                    behColl.Add(new TBehavior());
                }    
            }
        }
    }

সুতরাং আপনি সহজেই এর মতো অনেকগুলি উপাদান দিয়ে এটি পুনরায় ব্যবহার করতে পারেন:

public class ComboBoxBehaviour : AttachableForStyleBehavior<ComboBox, ComboBoxBehaviour>
    { ... }

এবং এক্সএএমএল-তে ঘোষণা করার মতো যথেষ্ট:

 <Style TargetType="ComboBox">
            <Setter Property="behaviours:ComboBoxBehaviour.IsEnabledForStyle" Value="True"/>

সুতরাং প্রাথমিকভাবে AttachableForStyleBehaviver ক্লাসে xaml জিনিস তৈরি করে শৈলীতে প্রতিটি উপাদানগুলির জন্য আচরণের উদাহরণটি নিবন্ধন করে। আরও তথ্যের জন্য, লিঙ্কটি দেখুন।


একটি যাদুমন্ত্র মত কাজ করে! আমার স্ক্রোলিংহ্যাভিয়ার সম্মিলিত হয়ে আমি অভ্যন্তরীণ রোডিটেলসপ্যাম্পেট-ডেটাগ্রিডগুলি পিতামাতার ডেটাগ্রিডগুলি স্ক্রোল না করা থেকে মুক্তি পেয়েছি।
ফিলিপ মাইকেলসকি

সাহায্য করতে পেরে আনন্দিত, =)
রোমা বোরোডভ

4
আচরণে নির্ভরতা বৈশিষ্ট্যগুলির সাথে ডেটা বাঁধাই সম্পর্কে কী?
জোবাডিনিজ

আমি কীভাবে ব্যবহারকারীর সাথে যোগাযোগ করব বা ব্যক্তিগতভাবে নেতিবাচক প্রতিক্রিয়া দিয়ে সম্পাদনা প্রত্যাখ্যান করব তা আমি জানি না। প্রিয় প্রিয় @ ডের_মিস্টার এবং অন্যান্য সম্পাদকগণ, কোডটি সম্পাদনা করার চেষ্টা করার আগে দয়া করে যত্ন সহকারে পড়ুন। এটি অন্যান্য ব্যবহারকারী এবং আমার খ্যাতিকেও প্রভাবিত করতে পারে। এক্ষেত্রে, ইসডেবলফোর্ড স্টাইল সম্পত্তিটি মুছে ফেলার মাধ্যমে এবং অবিচলিতভাবে এটি স্থিতিশীল পদ্ধতিগুলির সাথে প্রতিস্থাপন করে, আপনি এটি xaml এ আবদ্ধ হওয়ার সম্ভাবনাটি ধ্বংস করে যা এই প্রশ্নের মূল বিষয়। সুতরাং দেখে মনে হচ্ছে আপনি শেষ পর্যন্ত কোডটি পড়েন নি। দুঃখজনকভাবে আমি আপনার সম্পাদনাটি দুর্দান্ত বিয়োগ দিয়ে প্রত্যাখ্যান করতে পারি না, তাই দয়া করে ভবিষ্যতে সতর্ক হন।
রোমা বোরোডভ

4
@ রোমাবারোডভ, এক্সএএমএল-এ সমস্ত কিছু কাজ করে। সংযুক্ত সম্পত্তি (যা নির্ভরশীল সম্পত্তি থেকে পৃথক) সংজ্ঞায়নের সঠিক উপায়। ডকুমেন্টেশন দেখুন: ডকস.মাইক্রোসফট
en-

19

1. সংযুক্ত সম্পত্তি তৈরি করুন

public static class DataGridCellAttachedProperties
{
    //Register new attached property
    public static readonly DependencyProperty IsSingleClickEditModeProperty =
        DependencyProperty.RegisterAttached("IsSingleClickEditMode", typeof(bool), typeof(DataGridCellAttachedProperties), new UIPropertyMetadata(false, OnPropertyIsSingleClickEditModeChanged));

    private static void OnPropertyIsSingleClickEditModeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var dataGridCell = d as DataGridCell;
        if (dataGridCell == null)
            return;

        var isSingleEditMode = GetIsSingleClickEditMode(d);
        var behaviors =  Interaction.GetBehaviors(d);
        var singleClickEditBehavior = behaviors.SingleOrDefault(x => x is SingleClickEditDataGridCellBehavior);

        if (singleClickEditBehavior != null && !isSingleEditMode)
            behaviors.Remove(singleClickEditBehavior);
        else if (singleClickEditBehavior == null && isSingleEditMode)
        {
            singleClickEditBehavior = new SingleClickEditDataGridCellBehavior();
            behaviors.Add(singleClickEditBehavior);
        }
    }

    public static bool GetIsSingleClickEditMode(DependencyObject obj)
    {
        return (bool) obj.GetValue(IsSingleClickEditModeProperty);
    }

    public static void SetIsSingleClickEditMode(DependencyObject obj, bool value)
    {
        obj.SetValue(IsSingleClickEditModeProperty, value);
    }
}

2. একটি আচরণ তৈরি করুন

public class SingleClickEditDataGridCellBehavior:Behavior<DataGridCell>
        {
            protected override void OnAttached()
            {
                base.OnAttached();
                AssociatedObject.PreviewMouseLeftButtonDown += DataGridCellPreviewMouseLeftButtonDown;
            }

            protected override void OnDetaching()
            {
                base.OnDetaching();
                AssociatedObject.PreviewMouseLeftButtonDown += DataGridCellPreviewMouseLeftButtonDown;
            }

            void DataGridCellPreviewMouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
            {
                 DataGridCell cell = sender as DataGridCell;
                if (cell != null && !cell.IsEditing && !cell.IsReadOnly)
                {
                    if (!cell.IsFocused)
                    {
                        cell.Focus();
                    }
                    DataGrid dataGrid = LogicalTreeWalker.FindParentOfType<DataGrid>(cell); //FindVisualParent<DataGrid>(cell);
                    if (dataGrid != null)
                    {
                        if (dataGrid.SelectionUnit != DataGridSelectionUnit.FullRow)
                        {
                            if (!cell.IsSelected)
                                cell.IsSelected = true;
                        }
                        else
                        {
                            DataGridRow row =  LogicalTreeWalker.FindParentOfType<DataGridRow>(cell); //FindVisualParent<DataGridRow>(cell);
                            if (row != null && !row.IsSelected)
                            {
                                row.IsSelected = true;
                            }
                        }
                    }
                }
            }    
        }

3. একটি স্টাইল তৈরি করুন এবং সংযুক্ত সম্পত্তি সেট করুন

        <Style TargetType="{x:Type DataGridCell}">
            <Setter Property="Behaviors:DataGridCellAttachedProperties.IsSingleClickEditMode" Value="True"/>
        </Style>

আমি যখন স্টাইল থেকে DependencyProperty অ্যাক্সেস করার চেষ্টা করি তখন এটি বলে যে ইসসিংলক্লিকএডিটমোড স্বীকৃত নয় বা অ্যাক্সেসযোগ্য নয়?
ইগর মেসারোস

দুঃখিত আমার খারাপ .. যত তাড়াতাড়ি আমি মন্তব্য আমি উপলব্ধি GetIsSingleClickEditMode স্ট্রিং আপনি DependencyProperty.RegisterAttached করার জন্য পাস সুসংগত হওয়া আবশ্যক
ইগর Meszaros

অনডেটিচিং আরও একটি ইভেন্ট হ্যান্ডলার যুক্ত করেছে, এটি ঠিক করা উচিত (কোনও পোস্ট সম্পাদনা করার সময় কোনও একক অক্ষরকে সংশোধন করতে পারে না ...)
বালিন্টপোগ্যাটসা

11

প্রতিটি আচরণের জন্য একটি সংযুক্ত সম্পত্তি তৈরি এড়াতে আমার আরও ধারণা রয়েছে:

  1. আচরণ স্রষ্টার ইন্টারফেস:

    public interface IBehaviorCreator
    {
        Behavior Create();
    }
    
  2. ছোট সহায়ক সংগ্রহ:

    public class BehaviorCreatorCollection : Collection<IBehaviorCreator> { }
    
  3. সাহায্যকারী শ্রেণি যা আচরণটি সংযুক্ত করে:

    public static class BehaviorInStyleAttacher
    {
        #region Attached Properties
    
        public static readonly DependencyProperty BehaviorsProperty =
            DependencyProperty.RegisterAttached(
                "Behaviors",
                typeof(BehaviorCreatorCollection),
                typeof(BehaviorInStyleAttacher),
                new UIPropertyMetadata(null, OnBehaviorsChanged));
    
        #endregion
    
        #region Getter and Setter of Attached Properties
    
        public static BehaviorCreatorCollection GetBehaviors(TreeView treeView)
        {
            return (BehaviorCreatorCollection)treeView.GetValue(BehaviorsProperty);
        }
    
        public static void SetBehaviors(
            TreeView treeView, BehaviorCreatorCollection value)
        {
            treeView.SetValue(BehaviorsProperty, value);
        }
    
        #endregion
    
        #region on property changed methods
    
        private static void OnBehaviorsChanged(DependencyObject depObj, DependencyPropertyChangedEventArgs e)
        {
            if (e.NewValue is BehaviorCreatorCollection == false)
                return;
    
            BehaviorCreatorCollection newBehaviorCollection = e.NewValue as BehaviorCreatorCollection;
    
            BehaviorCollection behaviorCollection = Interaction.GetBehaviors(depObj);
            behaviorCollection.Clear();
            foreach (IBehaviorCreator behavior in newBehaviorCollection)
            {
                behaviorCollection.Add(behavior.Create());
            }
        }
    
        #endregion
    }
    
  4. এখন আপনার আচরণ, যা আইবিহেভিয়ারক্রিটার প্রয়োগ করে:

    public class SingleClickEditDataGridCellBehavior:Behavior<DataGridCell>, IBehaviorCreator
    {
        //some code ...
    
        public Behavior Create()
        {
            // here of course you can also set properties if required
            return new SingleClickEditDataGridCellBehavior();
        }
    }
    
  5. এবং এখন এটি xaml এ ব্যবহার করুন:

    <Style TargetType="{x:Type DataGridCell}">
      <Setter Property="helper:BehaviorInStyleAttacher.Behaviors" >
        <Setter.Value>
          <helper:BehaviorCreatorCollection>
            <behaviors:SingleClickEditDataGridCellBehavior/>
          </helper:BehaviorCreatorCollection>
        </Setter.Value>
      </Setter>
    </Style>
    

5

আমি মূল নিবন্ধটি খুঁজে পাইনি তবে আমি প্রভাবটি পুনরায় তৈরি করতে সক্ষম হয়েছি।

#region Attached Properties Boilerplate

    public static readonly DependencyProperty IsActiveProperty = DependencyProperty.RegisterAttached("IsActive", typeof(bool), typeof(ScrollIntoViewBehavior), new PropertyMetadata(false, OnIsActiveChanged));

    public static bool GetIsActive(FrameworkElement control)
    {
        return (bool)control.GetValue(IsActiveProperty);
    }

    public static void SetIsActive(
      FrameworkElement control, bool value)
    {
        control.SetValue(IsActiveProperty, value);
    }

    private static void OnIsActiveChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var behaviors = Interaction.GetBehaviors(d);
        var newValue = (bool)e.NewValue;

        if (newValue)
        {
            //add the behavior if we don't already have one
            if (!behaviors.OfType<ScrollIntoViewBehavior>().Any())
            {
                behaviors.Add(new ScrollIntoViewBehavior());
            }
        }
        else
        {
            //remove any instance of the behavior. (There should only be one, but just in case.)
            foreach (var item in behaviors.ToArray())
            {
                if (item is ScrollIntoViewBehavior)
                    behaviors.Remove(item);
            }
        }
    }


    #endregion
<Style TargetType="Button">
    <Setter Property="Blah:ScrollIntoViewBehavior.IsActive" Value="True" />
</Style>

প্রতিটি আচরণের জন্য এটি লিখতে পিতা যদিও কিছুটা হলেও।
স্টিফেন ড্রু

0

আচরণ কোডটি একটি ভিজ্যুয়াল প্রত্যাশা করে, তাই আমরা এটিকে কেবল একটি ভিজ্যুয়ালে যুক্ত করতে পারি। সুতরাং আমি দেখতে পেলাম কেবলমাত্র বিকল্পটি হ'ল কন্ট্রোলটিপ্লেটের অভ্যন্তরে যে কোনও একটি উপাদান যুক্ত করা যাতে আচরণটি স্টাইলে যুক্ত করা যায় এবং একটি বিশেষ নিয়ন্ত্রণের সমস্ত ঘটনাকে প্রভাবিত করে।


0

নিবন্ধটি ডাব্লুপিএফের সংযুক্ত আচরণের সাথে পরিচয় করিয়ে দেয় কেবল স্টাইল ব্যবহার করে একটি সংযুক্ত আচরণ প্রয়োগ করে এবং এটি সম্পর্কিত বা সহায়ক হতে পারে।

"সংযুক্ত আচরণের ভূমিকা" নিবন্ধের কৌশলটি স্টাইল ব্যবহার করে ইন্টারেক্টিভিটি ট্যাগগুলি সম্পূর্ণভাবে এড়িয়ে চলে। আমি জানি না এটি কেবল কারণ এটি একটি আরও তারিখী কৌশল, বা যদি এখনও কিছু সুবিধা দেয় যেখানে কোনও ব্যক্তিকে কিছু পরিস্থিতিতে এটি পছন্দ করা উচিত।


4
এটি একটি মিশ্রিত আচরণ নয়, এটি একটি সাধারণ সংযুক্ত সম্পত্তি দ্বারা "আচরণ"।
স্টিফেন ড্র

0

আমি এই থ্রেডে রোমান ডিভসকিন এবং জনাথন অ্যালেনের উত্তরগুলির দ্বারা দেখানো পদ্ধতির পছন্দ করি। আমি যখন প্রথম সেই কৌশলটি শিখছিলাম তখন আমি এই ব্লগ পোস্টটি থেকে উপকৃত হলাম যা কৌশল সম্পর্কে আরও ব্যাখ্যা সরবরাহ করে। এবং প্রসঙ্গে সবকিছু দেখতে, এখানে লেখক তার ব্লগ পোস্টে যে শ্রেণীর বিষয়ে কথা বলেছেন তার পুরো উত্স কোড এখানে here


0

সংস্থান হিসাবে স্বতন্ত্র আচরণ / ট্রিগার ঘোষণা করুন:

<Window.Resources>

    <i:EventTrigger x:Key="ET1" EventName="Click">
        <ei:ChangePropertyAction PropertyName="Background">
            <ei:ChangePropertyAction.Value>
                <SolidColorBrush Color="#FFDAD32D"/>
            </ei:ChangePropertyAction.Value>
        </ei:ChangePropertyAction>
    </i:EventTrigger>

</Window.Resources>

সেগুলি সংগ্রহের মধ্যে sertোকান:

<Button x:Name="Btn1" Content="Button">

        <i:Interaction.Triggers>
             <StaticResourceExtension ResourceKey="ET1"/>
        </i:Interaction.Triggers>

</Button>

4
এটি কীভাবে উত্তর দেয়? আপনার উত্তরের একটি শৈলীর মাধ্যমে ট্রিগার যোগ করা হয়নি।
Kryptos

0

এই উত্তরের ভিত্তিতে আমি একটি সহজ সমাধান করেছি, কেবলমাত্র একটি শ্রেণীর প্রয়োজন এবং আপনার আচরণে অন্য কিছু বাস্তবায়নের দরকার নেই।

public static class BehaviorInStyleAttacher
{
    #region Attached Properties

    public static readonly DependencyProperty BehaviorsProperty =
        DependencyProperty.RegisterAttached(
            "Behaviors",
            typeof(IEnumerable),
            typeof(BehaviorInStyleAttacher),
            new UIPropertyMetadata(null, OnBehaviorsChanged));

    #endregion

    #region Getter and Setter of Attached Properties

    public static IEnumerable GetBehaviors(DependencyObject dependencyObject)
    {
        return (IEnumerable)dependencyObject.GetValue(BehaviorsProperty);
    }

    public static void SetBehaviors(
        DependencyObject dependencyObject, IEnumerable value)
    {
        dependencyObject.SetValue(BehaviorsProperty, value);
    }

    #endregion

    #region on property changed methods

    private static void OnBehaviorsChanged(DependencyObject depObj, DependencyPropertyChangedEventArgs e)
    {
        if (e.NewValue is IEnumerable == false)
            return;

        var newBehaviorCollection = e.NewValue as IEnumerable;

        BehaviorCollection behaviorCollection = Interaction.GetBehaviors(depObj);
        behaviorCollection.Clear();
        foreach (Behavior behavior in newBehaviorCollection)
        {
            // you need to make a copy of behavior in order to attach it to several controls
            var copy = behavior.Clone() as Behavior;
            behaviorCollection.Add(copy);
        }
    }

    #endregion
}

এবং নমুনা ব্যবহার হয়

<Style TargetType="telerik:RadComboBox" x:Key="MultiPeriodSelectableRadComboBox">
    <Setter Property="AllowMultipleSelection" Value="True" />
    <Setter Property="behaviors:BehaviorInStyleAttacher.Behaviors">
        <Setter.Value>
            <collections:ArrayList>
                <behaviors:MultiSelectRadComboBoxBehavior
                        SelectedItems="{Binding SelectedPeriods}"
                        DelayUpdateUntilDropDownClosed="True"
                        SortSelection="True" 
                        ReverseSort="True" />
            </collections:ArrayList>
        </Setter.Value>
    </Setter>
</Style>

অ্যারেলিস্ট ব্যবহার করতে এই এক্সএমএনএলগুলি যুক্ত করতে ভুলবেন না:

xmlns:collections="clr-namespace:System.Collections;assembly=mscorlib"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.