2009-05-07 21 views
19
होना चाहिए

मैं एक UserControl, के समान बना लिया है निम्नलिखित:ट्रिगर संग्रह सदस्यों प्रकार के EventTrigger

<UserControl> 
    <StackPanel Orientation="Vertical"> 

     <StackPanel x:Name="Launch" Orientation="Horizontal" Visibility="Collapsed"> 
      <!-- Children here --> 
     </StackPanel> 

     <ToggleButton x:Name="ToggleLaunch" IsChecked="False" Content="Launch" /> 

    </StackPanel> 
</UserControl> 

मैं 'लॉन्च' बनाने के लिए एक DataTrigger उपयोग करने का प्रयास किया गया है दिखाई देने लगते हैं StackPanel जब ToggleButton की जांच की जाती है, और अन्यथा ध्वस्त हो जाती है। हालांकि, रनटाइम पर मुझे "विफल ऑब्जेक्ट प्रारंभिकरण (ISupportInitialize.EndInit) बताते हुए एक त्रुटि मिलती है। ट्रिगर्स संग्रह सदस्यों को EventTrigger प्रकार का होना चाहिए"। मैंने इसे बिना किसी सफलता के UserControl और StackPanel के ट्रिगर संग्रह में जोड़ने का प्रयास किया है। मेरा ट्रिगर एक्सएएमएल निम्न जैसा दिखता है:

<DataTrigger Binding="{Binding ElementName=ToggleLaunch, Path=IsChecked}" Value="True"> 
    <Setter TargetName="Launch" Property="UIElement.Visibility" Value="Visible" /> 
</DataTrigger> 

उत्तर

13

इसे समझने के लिए प्रबंधित किया गया। भूल गए हैं कि डेटा ट्रिगर MSDN Docs.

प्रति समाधान त्रुटि संदेश के रूप में इवेंट ट्रिगर का उपयोग करना था।

<EventTrigger RoutedEvent="ToggleButton.Checked"> 
    <BeginStoryboard> 
     <Storyboard> 
      <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility" 
              Storyboard.TargetName="LaunchButtons"> 
       <DiscreteObjectKeyFrame KeyTime="0:0:0" 
             Value="{x:Static Visibility.Visible}" /> 
      </ObjectAnimationUsingKeyFrames> 
     </Storyboard> 
    </BeginStoryboard> 
</EventTrigger> 
<EventTrigger RoutedEvent="ToggleButton.Unchecked"> 
    <BeginStoryboard> 
     <Storyboard> 
      <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility" 
              Storyboard.TargetName="LaunchButtons"> 
       <DiscreteObjectKeyFrame KeyTime="0:0:0" 
             Value="{x:Static Visibility.Collapsed}" /> 
      </ObjectAnimationUsingKeyFrames> 
     </Storyboard> 
    </BeginStoryboard> 
</EventTrigger> 

मामले में किसी को जवाब के रूप में यह अंकन को रोकना जा रहे हैं और कुछ अन्य समाधान है: मेरा समाधान निम्नलिखित था।

4

तुम भी ToggleButton में IsChecked संपत्ति के लिए अपने StackPanel में दृश्यता के लिए बाध्य कर सकता है। आपको कस्टम वैल्यू कनवर्टर का उपयोग करने की आवश्यकता होगी। यहां एक है जो मुझे ऑनलाइन मिला:

/// <summary> 
/// WPF/Silverlight ValueConverter : Convert boolean to XAML Visibility 
/// </summary> 
[ValueConversion(typeof(bool), typeof(Visibility))] 
public class VisibilityConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
    return (value != null && (bool)value) ? Visibility.Visible : Visibility.Collapsed; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
    Visibility visibility = (Visibility)value; 
    return (visibility == Visibility.Visible); 
    } 
} 
4

यह निराशाजनक रूप से पुराना हो सकता है, लेकिन मेरे लिए निम्नलिखित कार्य करता है। यह लोगों के साथ समस्या में चल रहा है मदद कर सकता है: "ट्रिगर संग्रह सदस्यों प्रकार EventTrigger का होना चाहिए"

<Control> 
    <Control.Template> 
    <ControlTemplate > 

     <!-- Design --> 
     <StackPanel> 
     <CheckBox Name="CollapseControl" Content="Show" IsChecked="False" /> 
     <Label Name="CollapseTarget" Content="MyContent" Visibility="Collapsed" /> 
     </StackPanel> 

     <!-- Triggers --> 
     <ControlTemplate.Triggers > 
     <Trigger SourceName="CollapseControl" Property="IsChecked" Value="True" > 
      <Setter TargetName="CollapseTarget" Property="Visibility" Value="Visible" /> 
     </Trigger> 
     </ControlTemplate.Triggers> 

    </ControlTemplate> 
    </Control.Template> 
</Control> 

encapsulating के अंदर एक नियंत्रण वस्तु आप Control.Template उपयोग करने के लिए किसी भी उपयोग करने के लिए अनुमति देता है "क्या आप नियंत्रित करना चाहते" ट्रिगर आप चाहते हैं। इस तरह आप अपने एक्सएएमएल में सीधे (डेटा) ट्रिगर्स का उपयोग कर सकते हैं, जहां आप एक स्थिर शैली या पूरी तरह से नया UserControl परिभाषित किए बिना करना चाहते हैं।

25
MSDN Docs से

, के रूप में प्रति (थोड़ा संशोधित) रिचर्ड सी McGuire से जवाब:

:

DataTriggers can be used with XML tags Style, ControlTemplate and DataTemplate

उदाहरण के लिए, यदि आप एक TextBlock करने के लिए एक ट्रिगर जोड़ने का प्रयास है, यह इस त्रुटि उत्पन्न होगा

Error: Triggers collection members must be of type EventTrigger

क्यों? एक Trigger केवल एक Style, ControlTemplate या DataTemplate के अंदर रखा जा सकता है, और हम एक TextBlock अंदर सीधे यह जगह करने की कोशिश कर रहे हैं।

इस मामले में, फिक्स आसान है: बस ट्रिगर को स्टाइल में लपेटें, फिर इस शैली को TextBlock के अंदर रखें, और त्रुटि गायब हो जाएगी।

<TextBlock x:Name="Hello" Text="{Binding Hello, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"> 
    <TextBlock.Triggers> 
     <DataTrigger Binding="{Binding Hello}" Value="GoGreen"> 
      <Setter Property="Foreground" Value="Green" /> 
     </DataTrigger> 
    </TextBlock.Triggers> 
</TextBlock> 

यहाँ XAML के बाद ठीक है:

यहाँ त्रुटि पैदा XAML से पहले ठीक है

<TextBlock x:Name="Hello" Text="{Binding Hello, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"> 
    <TextBlock.Style> 
     <Style TargetType="TextBlock"> 
      <Setter Property="Foreground" Value="Red" /> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Hello}" Value="GoGreen"> 
        <Setter Property="Foreground" Value="Green" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </TextBlock.Style> 
</TextBlock> 

यहां एक नमूना है कि दिखा स्क्रीनशॉट है अगर हम GoGreen दर्ज करें, पाठ हरा हो जाता है:

enter image description here

... और हम कुछ और दर्ज करते हैं, लाल करने के लिए पाठ चूक:

enter image description here

के बारे में WPF चलाता है वेब पर मुफ्त सामग्री का भार है, और उन सभी को यथोचित एक कर अवधारणा को समझाने का अच्छा काम, और this page was the one that made the penny drop for me

+6

यदि आपके पास पहले से ही त्रुटियों से बचने के लिए आपके UI नियंत्रण पर एक * स्टाइल * संसाधन सेट है (जैसा कि यह मेरे साथ हुआ), तो बस इसे स्थानीय शैली के आधार पर * डेटाट्रिगर * के रूप में बदलें। जैसा कि: '