2009-04-28 14 views
7

मेरे पास एकाधिक स्टोरीबोर्ड हैं जो एक ही संपत्ति तक पहुंचते हैं (एक ही समय में नहीं)। एक स्टोरीबोर्ड ने संपत्ति को बदलने के बाद, दूसरे को इसका कोई फायदा नहीं हुआ और कुछ भी नहीं बदला .. मैं इसके खिलाफ क्या कर सकता हूं?एक संपत्ति पर एकाधिक स्टोरीबोर्ड

नमूना:

<ListBox> 
    <ListBox.ItemContainerStyle> 
     <Style TargetType="ListBoxItem"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type ListBoxItem}"> 
         <Border Name="Border" BorderBrush="DarkGray" BorderThickness="1" Margin="3"> 
          <ContentPresenter /> 
          <Border.Background> 
           <SolidColorBrush /> 
          </Border.Background> 
         </Border> 
         <ControlTemplate.Triggers> 
          <Trigger Property="IsSelected" Value="True"> 
           <Trigger.EnterActions> 
            <BeginStoryboard> 
             <Storyboard> 
              <ColorAnimation Storyboard.TargetName="Border" Storyboard.TargetProperty="Background.Color" To="#3e8bff" Duration="0:0:0.1" /> 
             </Storyboard> 
            </BeginStoryboard> 
           </Trigger.EnterActions> 
           <Trigger.ExitActions> 
            <BeginStoryboard> 
             <Storyboard> 
              <ColorAnimation Storyboard.TargetName="Border" Storyboard.TargetProperty="Background.Color" To="White" Duration="0:0:0.1" /> 
             </Storyboard> 
            </BeginStoryboard> 
           </Trigger.ExitActions> 
          </Trigger> 
          <MultiTrigger> 
           <MultiTrigger.Conditions> 
            <Condition Property="IsMouseOver" Value="True" /> 
            <Condition Property="IsSelected" Value="False" /> 
           </MultiTrigger.Conditions> 
           <MultiTrigger.EnterActions> 
            <BeginStoryboard> 
             <Storyboard> 
              <ColorAnimation Storyboard.TargetName="Border" Storyboard.TargetProperty="Background.Color" To="Orange" Duration="0:0:0.1" /> 
             </Storyboard> 
            </BeginStoryboard> 
           </MultiTrigger.EnterActions> 
           <MultiTrigger.ExitActions> 
            <BeginStoryboard> 
             <Storyboard> 
              <ColorAnimation Storyboard.TargetName="Border" Storyboard.TargetProperty="Background.Color" To="White" Duration="0:0:0.1" /> 
             </Storyboard> 
            </BeginStoryboard> 
           </MultiTrigger.ExitActions> 
          </MultiTrigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </ListBox.ItemContainerStyle> 
    <ListBox.Items> 
     <sys:String>hey</sys:String> 
     <sys:String>du</sys:String> 
     <sys:String>dux</sys:String> 
     <sys:String>duy</sys:String> 
     <sys:String>dua</sys:String> 
    </ListBox.Items> 
</ListBox> 

यह मैं कर सकता सबसे छोटी नमूना कोड है। किसी आइटम को छिपाने के बाद, यह चयनित होने पर नीला नहीं होगा (एक आइटम पर क्लिक करने का प्रयास करें और फिर तीर कुंजियों का उपयोग बिना उन्हें घुमाने के आइटम का चयन करें)।

+0

"दूसरे व्यक्ति के पास इसका कोई उपयोग नहीं है और कुछ भी नहीं बदलता है" का क्या मतलब है? क्या आपको एक त्रुटि संदेश मिलता है? विशिष्ट अप्रत्याशित व्यवहार? –

+0

अधिक विशिष्ट होने के लिए, मेरे पास एक सूची बॉक्स है। ItemContainerStyle में मैं सभी ListBoxItems के लिए एक टेम्पलेट परिभाषित करता हूं। यहां मैं IsMouseOver को ट्रिगर करता हूं और एक चयनित फीड इन/आउट प्रभाव के लिए स्टोरीबोर्ड को परिभाषित करता हूं। जब आइटम आच्छादित होता है, तो पृष्ठभूमि नारंगी होनी चाहिए, और जब इसे चुना जाता है तो इसे नीला रंग बदलना चाहिए। मैं जितनी बार चाहूं एक आइटम को होवर कर सकता हूं, यह काम करता है। लेकिन अगर मैं इसे चुनता हूं, और इसे फिर से अचयनित करता हूं, तो होवर प्रभाव अब और काम नहीं करता है। अगर मैं विभिन्न गुणों का उपयोग करता हूं, तो यह अभी भी काम करता है। – eWolf

+0

यह ट्रिगर्स के आदेश के साथ कुछ प्रतीत होता है। यदि मैं IsMeouse ट्रिगर के सामने IsSelected ट्रिगर डालता हूं (जो, वैसे, एक मल्टी ट्रिगर होता है और जब आइटम को चुना जाता है तो उठाया नहीं जाता है), यह दूसरा तरीका है: आइटम का चयन करने के बाद IsSelected प्रभाव काम नहीं करता है एक बार। – eWolf

उत्तर

12

मेरे पास एक समाधान है !!! ट्रिगर्स और एक्शन ऑर्डर मायने रखता है ... जवाब एक ही समय में एक स्टोरीबोर्ड को और अधिक नहीं खेलना है, बस दूसरे को रोकें।

<ControlTemplate.Triggers> 
    <MultiTrigger> 
      <MultiTrigger.Conditions> 
       <Condition Property="IsMouseOver" Value="True"/> 
       <Condition Property="Selector.IsSelected" Value="False" /> 
      </MultiTrigger.Conditions> 
      <MultiTrigger.EnterActions> 
       <StopStoryboard BeginStoryboardName="SelectedBegin" /> 
       <StopStoryboard BeginStoryboardName="UnselectBegin" /> 
       <BeginStoryboard x:Name="EnterBegin" Storyboard="{StaticResource MouseEnterSb}"/> 
      </MultiTrigger.EnterActions> 
      <MultiTrigger.ExitActions> 
       <BeginStoryboard x:Name="LeaveBegin" Storyboard="{StaticResource MouseLeaveSb}"/> 
      </MultiTrigger.ExitActions> 
     </MultiTrigger> 
     <Trigger Property="Selector.IsSelected" Value="True"> 
    <Trigger.EnterActions> 
       <StopStoryboard BeginStoryboardName="LeaveBegin" /> 
       <StopStoryboard BeginStoryboardName="EnterBegin" /> 
       <BeginStoryboard x:Name="SelectedBegin" Storyboard="{StaticResource SelectedSb}"/> 
    </Trigger.EnterActions> 
    <Trigger.ExitActions> 
       <BeginStoryboard x:Name="UnselectBegin" Storyboard="{StaticResource UnselectSb}"/> 
    </Trigger.ExitActions> 
    </Trigger> 
</ControlTemplate.Triggers> 
+0

वाह। बहुत लंबे समय से मैंने इस सवाल को पोस्ट किया है ..;) कूल है कि आप इसे अंततः समझ सकते हैं! – eWolf

1

मैं निम्नलिखित कोड का उपयोग कर अपने गलत परिणाम (मैं भी स्टम्प्ड हूँ) पुन: पेश कर पाए हैं:,

<ListBox> 
<ListBox.ItemContainerStyle> 
    <Style TargetType="ListBoxItem"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type ListBoxItem}"> 
        <ControlTemplate.Resources> 
         <Storyboard x:Key="BorderAnimationToRed"> 
          <ColorAnimation Storyboard.TargetName="Border" Storyboard.TargetProperty="Background.Color" To="Red" Duration="0:0:0.1" /> 
         </Storyboard> 
         <Storyboard x:Key="BorderAnimationToBlue"> 
          <ColorAnimation Storyboard.TargetName="Border" Storyboard.TargetProperty="Background.Color" To="Blue" Duration="0:0:0.1" /> 
         </Storyboard> 
         <Storyboard x:Key="BorderAnimationToOrange"> 
          <ColorAnimation Storyboard.TargetName="Border" Storyboard.TargetProperty="Background.Color" To="Orange" Duration="0:0:0.1" /> 
         </Storyboard> 
         <Storyboard x:Key="BorderAnimationToWhite"> 
          <ColorAnimation Storyboard.TargetName="Border" Storyboard.TargetProperty="Background.Color" To="White" Duration="0:0:0.1" /> 
         </Storyboard> 
        </ControlTemplate.Resources> 
        <Border Name="Border" BorderBrush="DarkGray" BorderThickness="1" Margin="3"> 
         <ContentPresenter /> 
         <Border.Background> 
          <SolidColorBrush /> 
         </Border.Background> 
        </Border> 
        <ControlTemplate.Triggers> 
         <Trigger Property="IsMouseOver" Value="True"> 
          <Trigger.EnterActions> 
           <BeginStoryboard Storyboard="{StaticResource BorderAnimationToOrange}"/> 
          </Trigger.EnterActions> 
          <Trigger.ExitActions> 
           <BeginStoryboard Storyboard="{StaticResource BorderAnimationToWhite}"/> 
          </Trigger.ExitActions> 
         </Trigger> 
         <Trigger Property="IsSelected" Value="True"> 
          <Trigger.EnterActions> 
           <BeginStoryboard Storyboard="{StaticResource BorderAnimationToBlue}"/> 
          </Trigger.EnterActions> 
          <Trigger.ExitActions> 
           <BeginStoryboard Storyboard="{StaticResource BorderAnimationToWhite}"/> 
          </Trigger.ExitActions> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</ListBox.ItemContainerStyle> 
<ListBox.Items> 
    <sys:String>hey</sys:String> 
    <sys:String>du</sys:String> 
    <sys:String>dux</sys:String> 
    <sys:String>duy</sys:String> 
    <sys:String>dua</sys:String> 
</ListBox.Items> 

इस कोड को थोड़ा आसान है पढ़ने के लिए दृश्यों के रूप में, संसाधन, और ट्रिगर्स अलग से घोषित किए जाते हैं। हो सकता है कि आप अपना लक्ष्य पूरा करने के लिए EventTriggers का उपयोग करने का प्रयास कर सकें ("ListBoxItem.MouseEnter" और "ListBoxItem.MouseLeave" रूटिंग ईवेंट का उपयोग करके)। सौभाग्य!

+0

मुझे पता है कि सिर्फ दो नियंत्रण संशोधित करना चाहते हैं (यह मेरे मामले में संभव था, मैंने अभी एक सरल उदाहरण पोस्ट किया है)। त्वरित + गंदे .. – eWolf

संबंधित मुद्दे