SORU
30 EKİM 2009, Cuma


Nasıl Davranış Karışımı eklemek için bir Tarzı Belirleyici

Bir Düğme için davranış Karışım kasalı var. Nasıl app benim Düğmeleri tüm bu ayarlayabilirsiniz.

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

Ben çalıştığınızda, ancak:

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

Hatası alıyorum

Özelliği "Davranışlar" erişilebilir bir pasör yok.

CEVAP
24 Ocak 2011, PAZARTESİ


Aynı sorun bende de vardı ve bir çözüm buldum. Bunu çözdüm ve benim çözüm Marco ile ortak bir şey taşıdığını gördükten sonra bu soruyu buldum. Ancak, bu yaklaşım biraz farklı.

Asıl sorun davranışlar ve tetikleyiciler belirli bir nesne ile ilişkilendiren ve birden çok farklı ilişkili nesneler için bir davranış aynı örnek kullanın. Seni davranışını tanımlarken satır içi bu bire bir ilişki zorlar XAML. Tarzında bir davranış ayarlamak için çalıştığınızda, ancak, stili yeniden kullanılması için geçerli tüm nesneler için olabilir ve bu temel davranış, sınıflar, istisnalar atmak olacaktır. Aslında yazarlar bile bu, işe yaramayacağını bilerek yapmaya çalışıyor bizi engellemek için büyük çaba sarf etti.

İlk sorun, yapıcı iç çünkü davranış belirleyici bir değer inşa edemeyiz. Kendi davranış ve tetik koleksiyon sınıfları ihtiyacımız var.

Bir sonraki sorun davranış ve tetikleyici özellikler bağlı belirleyiciler yok ve tek-çizgi XAML ile eklenmiş olabilir. Bu sorunu biz birincil davranış ve tetikleyici özelliklerini değiştirmek kendi bağlı bizim özellikleri ile çözmek.

Üçüncü sorun davranış koleksiyonumuzu tek bir stil hedef için iyi olur. Bu kaynağın yeni bir kopyasını her zaman yaratan 7* *az kullanılmış XAML özelliğini kullanarak başvurulan çözmek.

Son sorun davranışları tetikler ve diğer stil belirleyiciler gibi değil; çılgınca şeyler yapabilirler çünkü yeni davranışları ile eski davranışlarını değiştirmek istemiyoruz. Eğer öyleyse kabul ettiğimizi bir kez ekleyin bir davranış olamaz et (ve böyle davranışlar şu anda çalışma), şu sonuca varabiliriz ki, davranışlar ve tetikleyiciler olması katkı maddesi ve bu gelişmeler bizim bağlı özellikler.

İşte bir örnek bu yaklaşım kullanarak

<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>

Örnek Tetikleyicileri kullanır ama işe aynı şekilde davranışları. Örnekte gösterelim:

  • stilin birden çok metin blokları uygulanabilir
  • veri çeşitli türleri doğru tüm iş bağlama
  • metin oluşturan bir eylem hata ayıklama çıkışı penceresinde

İşte, DebugAction örnek bir davranış. Davranışlar, tetikleyiciler ve eylemler dediğimiz bir eylem ve dilin kötüye kullanımı yoluyla daha düzgün"". davranışlar

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);
    }
}

Son olarak, bizim koleksiyonları ve tüm bu işi yapmak için eklenen özellikler. Interaction.Behaviors hedef emlak SupplementaryInteraction.Behaviors bu özelliği ayarlamak, çünkü denir ile benzerliği, Interaction.Behaviors davranışlar katacak ve aynı şekilde tetikler.

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);
    }
}

ve işte burada, tam işlevsel davranışlar ve tetikleyiciler stilleri ile başvurdu.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • apenney888

    apenney888

    27 EKİM 2010
  • Matt Stokes

    Matt Stokes

    22 Ocak 2008
  • PaulGBelliveau

    PaulGBellive

    5 Mart 2009