2016-12-06 5 views
0

У меня есть пользовательский UserControl, основанный на всплывающем окне (расширение всплывающего окна). Сейчас в этом UserControl У меня есть это:Всплывающее окно открыто на основе 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> 

Так что теперь я называю это в другой UserControl, в основном всплывающее окно получает открыт При переходе через ListItem с помощью мыши с помощью

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

Теперь моя проблема , Я пытаюсь не показывать всплывающее окно, когда нет элементов, но поскольку есть триггер уже из IsOpen = MouseOver, он не работает в зависимости от количества элементов. Как я могу это решить.

Я также уже пробовал свойство CanOpen Dependecy на моем CustomUserControl, а затем попытался связать с IsOpen на моем StoryBoard, но, по-видимому, нельзя использовать привязку в StoryBoard.

Так что я думаю, что я ищу решение для установки базы IsOpen на триггер и привязку.

+0

MultiDataTrigger? Кроме того, если вы привязываетесь к свойству Count из коллекции, убедитесь, что он реализует свойство INotifyPropertyChanged в свойстве Count (ObservableCollection делает, List is not), иначе вы будете утечки памяти. – 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». Я добавил код выше для Condition MouseOver и CanOpen - <Условие Binding = "{Binding ElementName = popupRoot, Path = CanOpen}" Value = "True" /> Мое имя пользователя пользователя popupRoot. И в другом UserControl у меня есть Listbox, в ListboxItemTemplate я устанавливаю CanOpen = True (просто чтобы проверить, что я не ввел Count). Только для этого списка это не работает. – user1702369

+0

Просьба представить полный воспроизводимый образец вашей проблемы. – mm8

Смежные вопросы