سؤال

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

<Button Click="ClickHandler">Click Me</Button>
<TextBox x:Name="MyInputTextBox" />
<ItemsControl ItemsSource="{Binding}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <TextBox x:Name="MyRepeatTextBox" Text="{Binding}" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

إذا MyRepeatTextBox.النص == MyInputTextBox.النص الذي ترغب في تغيير لون MyRepeatTextBox.الخلفية إلى اللون الأخضر.إذا MyRepeatTextBox.نص فارغ أريد تغيير اللون إلى الأحمر.كيف يمكنني تنفيذ انقر فوق الزر معالج ؟

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

المحلول

غير متأكد زر الحدث سيكون أفضل لهذا.

كما DataTriggers مرة أخرى جلبت من خارج WPF العالم ، تلك هي بها.لا يوجد IMultiValueConverter سواء.السلوكيات حاليا ، ولكن هناك لطيفة codeplex المشروع بالنسبة لهم.وأود أن استخدام هذا

public class MatchTextForegroundBehaviour : Behavior<TextBox>
{
    private TextBox _attachedElement;

    public static readonly DependencyProperty MatchForegroundProperty =
        DependencyProperty.Register("MatchForeground", typeof(Brush),
        typeof(MatchTextForegroundBehaviour),
        new PropertyMetadata(new SolidColorBrush(Colors.Green), OnMatchForegroundChanged));

    public static readonly DependencyProperty FallbackForegroundProperty =
        DependencyProperty.Register("FallbackForeground", typeof(Brush),
        typeof(MatchTextForegroundBehaviour),
        new PropertyMetadata(new SolidColorBrush(Colors.Black), OnFallbackForegroundChanged));

    public static readonly DependencyProperty TextToMatchProperty =
        DependencyProperty.Register("TextToMatch", typeof(string),
        typeof(MatchTextForegroundBehaviour),
        new PropertyMetadata(null, OnTextToMatchChanged));

    public Brush MatchForeground
    {
        get { return (Brush)GetValue(MatchForegroundProperty); }
        set { SetValue(MatchForegroundProperty, value); }
    }

    public Brush FallbackForeground
    {
        get { return (Brush)GetValue(FallbackForegroundProperty); }
        set { SetValue(FallbackForegroundProperty, value); }
    }

    public string TextToMatch
    {
        get { return (string)GetValue(TextToMatchProperty); }
        set { SetValue(TextToMatchProperty, value); }
    }

    /// <summary>
    /// Event when the behavior is attached to a element.
    /// </summary>
    protected override void OnAttached()
    {
        base.OnAttached();
        _attachedElement = AssociatedObject;
        if(_attachedElement != null)
            _attachedElement.TextChanged += (s,e) => ChangeForeground();
    }

    private static void OnMatchForegroundChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var behavior = (MatchTextForegroundBehaviour)d;

        behavior.ChangeForeground();
    }

    private static void OnTextToMatchChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var behavior = (MatchTextForegroundBehaviour)d;

        behavior.ChangeForeground();
    }

    private static void OnFallbackForegroundChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var behavior = (MatchTextForegroundBehaviour)d;

        behavior.ChangeForeground();
    }


    private void ChangeForeground()
    {
        if (_attachedElement == null) return;
        if (string.IsNullOrEmpty(TextToMatch)) return; // change foreground to red?

        if (_attachedElement.Text == TextToMatch)
        {
            _attachedElement.Foreground = MatchForeground;
        }
        else
        {
            _attachedElement.Foreground = FallbackForeground;
        }
    }
}

و xaml

<TextBox x:Name="MyRepeatTextBox" Text="{Binding}" 
         TextToMatch="{Binding Text, ElementName=MyInputTextBox}"
         FallbackForeground="Black" MatchForeground="Green" />

إذا حدث النقر على زر هو حقا كيف تريد أن تفعل هذا يمكنك محاولة التالية.لم بتجميع هذه ضد WinRT ، ولكن أعتقد أن كل شيء المستخدمة في WinRT.

استخدام التالية ExtensionMethod

internal static class TreeExtensions
{
    public static T GetChildElement<T>(this DependencyObject element) where T :FrameworkElement
    {
        if (element == null) return null;
        if(element.GetType() == typeof(T)) return (T)element;

        T childAsT = null;
        int count = VisualTreeHelper.GetChildrenCount(element);
        for (int i = 0; i < count; i++)
        {
            var child = VisualTreeHelper.GetChild(element, i);
            childAsT = child.GetChildElement<T>();
            if (childAsT != null) break;
        }
        return childAsT;
    }
}

داخل زر انقر فوق الحدث عليك أن تفعل ما يلي (على افتراض انك أعطى ItemsControl اسم itemsControl:

        foreach (var item in itemsControl.Items)
        {
            var element = itemsControl.ItemContainerGenerator.ContainerFromItem(item);
            var textblock = element.GetChildElement<TextBlock>();
            if (textblock != null)
            {
                if (textblock.Text == MyInputTextBox.Text)
                    textblock.Foreground = new SolidColorBrush(Colors.Green);
                else
                    textblock.Foreground = new SolidColorBrush(Colors.Black);
            }
        }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top