2011-07-12 32 views
1

我有這樣的WPF風格:如何在wpf彈出窗口中將IsOpen屬性設置爲True?

<Style x:Key="RequiredControlTemplate"> 
    <Style.Setters> 
     <Setter Property="Validation.ErrorTemplate"> 
      <Setter.Value> 
       <ControlTemplate> 
        <StackPanel> 
         <Popup IsOpen="{Binding ElementName=Adorner, Path=IsMouseOver}"> 
          <TextBlock Text="{Binding ElementName=Adorner, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}" /> 
         </Popup> 
         <Border Grid.Column="1" BorderBrush="Red" BorderThickness="1" HorizontalAlignment="Stretch"> 
          <AdornedElementPlaceholder Name="Adorner"/> 
         </Border> 
        </StackPanel> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style.Setters> 
</Style> 

我想,如果鼠標在裝飾器然後彈出是開放的,但IsOpen="{Binding ElementName=Adorner, Path=IsMouseOver}不行......

+0

你得到任何約束力的錯誤? – anivas

+0

yes:'...綁定不能在只讀屬性'IsMouseOver'上運行......' –

+0

我不太確切,但我認爲你應該指定彈出窗口的行爲,並在其中使用一些方法這使得'popup'打開。 – stukselbax

回答

1

我對你的風格做了一些改變。 加入夫婦的故事板與彈出開放......和觸發故事板裝飾器元素在控制檯玩

<Style x:Key="RequiredControlTemplate"> 
      <Style.Setters> 
       <Setter Property="Validation.ErrorTemplate"> 
        <Setter.Value> 
         <ControlTemplate> 
          <StackPanel> 
           <StackPanel.Resources> 
            <Storyboard x:Key="OnMouseEnter1"> 
             <BooleanAimationUsingKeyFrames Storyboard.TargetProperty="(Popup.IsOpen)" Storyboard.TargetName="popup"> 
              <DiscreteBooleanKeyFrame KeyTime="0" Value="True"/> 
             </BooleanAnimationUsingKeyFrames> 
            </Storyboard> 
            <Storyboard x:Key="OnMouseLeave1"> 
             <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="(Popup.IsOpen)" Storyboard.TargetName="popup"> 
              <DiscreteBooleanKeyFrame KeyTime="0" Value="True"/> 
              <DiscreteBooleanKeyFrame KeyTime="0:0:0.1" Value="False"/> 
             </BooleanAnimationUsingKeyFrames> 
            </Storyboard> 
           </StackPanel.Resources> 
           <Popup Name="popup"> 
            <TextBlock Text="{Binding ElementName=Adorner, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}" /> 
           </Popup> 
           <Border Grid.Column="1" BorderBrush="Red" BorderThickness="1" HorizontalAlignment="Stretch"> 
            <AdornedElementPlaceholder Name="Adorner"> 
             <AdornedElementPlaceholder.Triggers> 
              <EventTrigger RoutedEvent="Mouse.MouseLeave" SourceName="Adorner"> 
               <BeginStoryboard x:Name="OnMouseLeave1_BeginStoryboard" Storyboard="{StaticResource OnMouseLeave1}"/> 
              </EventTrigger> 
              <EventTrigger RoutedEvent="Mouse.MouseEnter" SourceName="Adorner"> 
               <BeginStoryboard Storyboard="{StaticResource OnMouseEnter1}"/> 
              </EventTrigger> 
             </AdornedElementPlaceholder.Triggers> 
            </AdornedElementPlaceholder> 
           </Border> 
          </StackPanel> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
      </Style.Setters> 
     </Style> 
1

添加Mode=OneWay具有約束力。 IsOpen默認爲TwoWay,只讀屬性不允許TwoWay綁定。

0

如果您未遵循MVVM模式,則可以在xaml中指定x:code,您可以在其中處理MouseOver事件,並使用EventSetter來附加它。

相關問題