2015-11-11 13 views
13

ऐसा लगता है कि यूडब्ल्यूपी एक्सएएमएल शैलियों में ट्रिगर्स का समर्थन नहीं करता है। निम्नलिखित जैसे ट्रिगर्स को पूरा करने के लिए आम कामकाज क्या है?यूडब्ल्यूपी स्टाइल ट्रिगर गुम है

<Style TargetType="Button"> 
    <Style.Triggers> 
     <Trigger Property="Visibility" Value="Collapsed"> 
      <Setter Property="Text" Value="" /> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

पल मैं निम्न विकल्प देखने UWP में चलाता पूरा करने के लिए कम:

उपयोग एनिमेशन या VisualStateTriggers। दोनों गलत हैं प्रतीत होता है अगर मैं स्क्रीन पर नियंत्रण समायोजित न करने के लिए उनका उपयोग करता हूं।


मुझे लगता है कि मुझे नियंत्रण के लिए सामान्य रूप से ट्रिगर्स को लागू करने का सही तरीका मिला। प्रदर्शन के रूप में नीचे दिए गए कोड देखें: अगर वहाँ ElementName के बिना एक समाधान है

xmlns:Interactivity="using:Microsoft.Xaml.Interactivity" 
xmlns:Core="using:Microsoft.Xaml.Interactions.Core" 

<Border x:Name="BackgroundElement" Tag="Text"> 
    <Interactivity:Interaction.Behaviors> 
     <Core:DataTriggerBehavior Binding="{Binding Tag, ElementName=BackgroundElement}" Value="Text"> 
      <Core:ChangePropertyAction PropertyName="BorderBrush" Value="AliceBlue" /> 
     </Core:DataTriggerBehavior> 
    </Interactivity:Interaction.Behaviors> 
</Border> 

यह भयानक होगा। मैं इसे पूर्वजों टाइप के साथ डब्ल्यूपीएफ में कर सकता था, लेकिन यह यूडब्लूपी में भी गायब है। वैसे भी, ऐसा लगता है कि आप शैली में Core:DataTriggerBehavior का उपयोग नहीं कर सकते हैं।

+0

UWP ऐप्स में, आप का उपयोग करने के [दृश्य राज्यों] (https://msdn.microsoft.com/library/windows/apps है /windows.ui.xaml.visualstatemanager.aspx)। – Herdo

+0

एक कस्टम स्टेट ट्रिगर (स्टेट ट्रिगरबेस से प्राप्त) बनाने में एक नज़र डालें और फिर उस दृश्य स्थिति के अंदर उपयोग करें –

उत्तर

5

WinRT में, RelativeSourceMode केवल स्व और TemplatedParent मोड, FindAncestor उपलब्ध नहीं है समर्थन करते हैं। तो जब आप XAML Behaviors का उपयोग करते हैं, तो आपको वर्कअराउंड के रूप में ElementName का उपयोग करने की आवश्यकता है। और यदि आप अपनी परियोजना में डेटाकॉन्टेक्स्ट या व्यूमोडेल का उपयोग कर रहे हैं, तो आप ElementName का उपयोग करने से बचने के लिए डेटाकॉन्टेक्स्ट या व्यूमोडेल से जुड़ सकते हैं। उदाहरण के लिए:

<Page ...> 
    <Page.Resources> 
     <local:MyViewModel x:Key="ViewModel" /> 
    </Page.Resources> 
    ... 
    <Border x:Name="BackgroundElement" DataContext="{Binding Source={StaticResource ViewModel}}"> 
     <Interactivity:Interaction.Behaviors> 
      <Core:DataTriggerBehavior Binding="{Binding Tag}" Value="Text"> 
       <Core:ChangePropertyAction PropertyName="Background" Value="Red" /> 
      </Core:DataTriggerBehavior> 
     </Interactivity:Interaction.Behaviors> 
    </Border> 
    ... 
</Page> 

और ViewModel ऊपर प्रयोग किया है:

public class MyViewModel : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private string _tag; 

    public string Tag 
    { 
     get 
     { 
      return _tag; 
     } 

     set 
     { 
      _tag = value; 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs("Tag")); 
      } 
     } 
    } 
} 
संबंधित मुद्दे