2016-12-06 35 views
0

我有一個基於Popup(擴展彈出框)的自定義UserControl。 現在,在這個用戶控件我有這樣的:Popup基於2條件打開

 <Popup.Style> 
    <Style TargetType="Popup"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding PlacementTarget.IsMouseOver, RelativeSource={RelativeSource Self}}" Value="True"> 
       <DataTrigger.EnterActions> 
        <BeginStoryboard x:Name="OpenPopupStoryBoard" > 
         <Storyboard> 
          <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="IsOpen" FillBehavior="HoldEnd"> 
           <DiscreteBooleanKeyFrame KeyTime="0:0:0.10" Value="True"/> 
          </BooleanAnimationUsingKeyFrames> 
         </Storyboard> 
        </BeginStoryboard> 
       </DataTrigger.EnterActions> 
       <DataTrigger.ExitActions> 
        <PauseStoryboard BeginStoryboardName="OpenPopupStoryBoard"/> 
        <BeginStoryboard x:Name="ClosePopupStoryBoard"> 
         <Storyboard> 
          <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="IsOpen" FillBehavior="HoldEnd"> 
           <DiscreteBooleanKeyFrame KeyTime="0:0:0.2" Value="False"/> 
          </BooleanAnimationUsingKeyFrames> 
         </Storyboard> 
        </BeginStoryboard> 
       </DataTrigger.ExitActions> 
      </DataTrigger> 

      <Trigger Property="IsMouseOver" Value="True"> 
       <Trigger.EnterActions> 
        <PauseStoryboard BeginStoryboardName="ClosePopupStoryBoard" /> 
       </Trigger.EnterActions> 
       <Trigger.ExitActions> 
        <PauseStoryboard BeginStoryboardName="OpenPopupStoryBoard"/> 
        <ResumeStoryboard BeginStoryboardName="ClosePopupStoryBoard" /> 
       </Trigger.ExitActions> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</Popup.Style> 

所以現在我把這個在另一個用戶控件,基本彈出被打開時,通過

<CustomControls:StandardPopup Isopen={Binding Value.Items.Count, Mode=OneWay, Converter={StaticResource ItemsCountToBoolean}, ConverterParameter=0}, PlacementTarget="{Binding ElementName=listboxItem}" Heading="ListItemDetails" > 

現在我的問題是要在與您的鼠標一個ListItem ,我試圖在沒有Items時顯示彈出框,但由於IsOpen = MouseOver已經有觸發器,因此它不能根據項目的計數工作。我該如何解決這個問題。

我也已經在我的CustomUserControl上嘗試了CanOpen Dependecy屬性,然後嘗試綁定到我的StoryBoard上的IsOpen,但是顯然不能在StoryBoard中使用綁定。

所以我想我正在尋找一個解決方案來設置IsOpen基礎的觸發器和綁定。

+0

MultiDataTrigger?此外,如果您綁定到集合的Count屬性,請確保它在Count屬性上實現INotifyPropertyChanged(ObservableCollection,List不),否則您將泄漏內存。 – Arie

回答

0

使用轉換器在這個DataTrigger

<DataTrigger Binding="{Binding PlacementTarget.IsMouseOver, RelativeSource={RelativeSource Self}}" Value="True">

一個例子可以是:

<DataTrigger Binding="{Binding PlacementTarget, RelativeSource={RelativeSource Self}, Converter={StaticResource CheckListBoxCnv}}" Value="True">

public class CheckListBoxConverter:IValueConverter 
{ 
    //Check for IsMouseOver property there and do some extra processing, and return true/false value. 
} 
0

我不知道你確定是否有任何 「物品」在Popup中,但是Arie建議你可以在多種條件下使用MultiDataTrigger。下面是一個例子給你:

<Style TargetType="Popup"> 
    <Style.Triggers> 
    <MultiDataTrigger> 
     <MultiDataTrigger.Conditions> 
      <Condition Binding="{Binding PlacementTarget.IsMouseOver, RelativeSource={RelativeSource Self}}" Value="True" /> 
      <!-- add your other condtion here that determines whether there are any items in the Popup, e.g.: --> 
      <Condition Binding="{Binding Items.Count, RelativeSource={RelativeSource Self}}" Value="0" /> 
     </MultiDataTrigger.Conditions> 
     <MultiDataTrigger.EnterActions> 
      <BeginStoryboard x:Name="OpenPopupStoryBoard" > 
       <Storyboard> 
        <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="IsOpen" FillBehavior="HoldEnd"> 
         <DiscreteBooleanKeyFrame KeyTime="0:0:0.10" Value="True"/> 
        </BooleanAnimationUsingKeyFrames> 
       </Storyboard> 
      </BeginStoryboard> 
     </MultiDataTrigger.EnterActions> 
     <MultiDataTrigger.ExitActions> 
      <PauseStoryboard BeginStoryboardName="OpenPopupStoryBoard"/> 
      <BeginStoryboard x:Name="ClosePopupStoryBoard"> 
       <Storyboard> 
        <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="IsOpen" FillBehavior="HoldEnd"> 
         <DiscreteBooleanKeyFrame KeyTime="0:0:0.2" Value="False"/> 
        </BooleanAnimationUsingKeyFrames> 
       </Storyboard> 
      </BeginStoryboard> 
     </MultiDataTrigger.ExitActions> 
    </MultiDataTrigger> 

    <Trigger Property="IsMouseOver" Value="True"> 
     <Trigger.EnterActions> 
      <PauseStoryboard BeginStoryboardName="ClosePopupStoryBoard" /> 
     </Trigger.EnterActions> 
     <Trigger.ExitActions> 
      <PauseStoryboard BeginStoryboardName="OpenPopupStoryBoard"/> 
      <ResumeStoryboard BeginStoryboardName="ClosePopupStoryBoard" /> 
     </Trigger.ExitActions> 
    </Trigger> 
</Style.Triggers> 

當然,你必須修改第二個條件綁定到確定是否有任何條款顯示現有的一些財產,但你應該明白我的意思。

+0

我感謝你的答案,但出於某種原因,彈出窗口根本無法在listboxItemTemplate中工作,對於其他所有工作。有任何想法嗎?所以現在在彈出控件中,我創建了一個依賴屬性「CanOpen」,默認值設置爲「True」。我爲條件MouseOver和CanOpen添加了上面的代碼 - 我的usercontrols名稱是popupRoot。而在另一個用戶控件我有一個列表框,在ListboxItemTemplate我設置CanOpen = True(只是爲了測試我沒有把計數)。只是爲了這個列表框不起作用。 – user1702369

+0

請提供您的問題的完整重現樣本。 – mm8