2016-08-13 31 views
0

我有两个按钮,其中绑定了命令。 如果用户将鼠标悬停在按钮1上,则只有在按钮1处于禁用状态时,它才会突出显示(边框颜色更改) textbox1和combobox1。将鼠标悬停在某个按钮上并在满足条件时突出显示多个控件(MVVM)

如果用户将鼠标悬停在BUTTON2更应突出(边框的颜色变化)仅当BUTTON2是禁用状态 TextBox2中,textbo3和combobox1

最后,不重视mouseleave上的控件。

这是纯粹的XAML,这是可能的,因为风格应该应用于其他控件,而不是触发事件的按钮本身,只有当条件满足? 这怎么可能呢?

我在SO上发现了很多例子,但它们不适用于这个特定的情况。

我开始以编程方式做到这一点:

<Button Name="btnGenerateHash" 
     IsEnabled="{Binding VM.IsGenerateButtonEnabled}" 
     Command="{Binding GenerateCommand}" 
     Content="{Binding VM.GenerateHashButtonLabel}" Width="160"      
     Grid.Row="1" Grid.Column="1" HorizontalAlignment="Right" Margin="10" > 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="MouseEnter"> 
      <i:InvokeCommandAction Command="{Binding HighlightFieldsCommand}" CommandParameter="{Binding Source='generate,enter'}"></i:InvokeCommandAction> 
     </i:EventTrigger> 
     <i:EventTrigger EventName="MouseLeave"> 
      <i:InvokeCommandAction Command="{Binding HighlightFieldsCommand}" CommandParameter="{Binding Source='generate,leave'}"></i:InvokeCommandAction> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
</Button> 

修改的版本:

<StackPanel Orientation="Vertical"> 
<CheckBox 
x:Name="EnableButton1CheckBox" 
Content="Enable Button1" 
Margin="4" 
/> 

<Grid Margin="4"> 

<Button Click="button1_Click" 
Content="Button1" 
x:Name="button1" 
IsEnabled="{Binding IsChecked, ElementName=EnableButton1CheckBox}"> 

</Button> 



<Border 
x:Name="Button1MouseDetector" 
Background="Transparent" 
> 
    <Border.Style> 
     <Style TargetType="Border"> 
      <Style.Triggers> 
       <Trigger Property="IsMouseOver" Value="True"> 
        <Setter Property="Tag" Value="MouseOver" /> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </Border.Style> 
</Border> 


    <!-- 
When button1 is disabled, it can't receive mouse events, so we create a 
coextensive control that's explicitly transparent. If it merely had no 
background specified, it wouldn't get mouse events either. 
--> 

</Grid> 


<Grid Margin="4"> 
<Button 
Content="Button2" 
x:Name="button2" 
IsEnabled="{Binding IsChecked, ElementName=EnableButton1CheckBox}"> 

</Button> 



<Border 
x:Name="Button2MouseDetector" 
Background="Transparent" 
> 
    <Border.Style> 
     <Style TargetType="Border"> 
      <Style.Triggers> 
       <Trigger Property="IsMouseOver" Value="True"> 
        <Setter Property="Tag" Value="MouseOver" /> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </Border.Style> 
</Border> 


    <!-- 
When button1 is disabled, it can't receive mouse events, so we create a 
coextensive control that's explicitly transparent. If it merely had no 
background specified, it wouldn't get mouse events either. 
--> 

</Grid>  

<TextBox 
Text="tb1" 
x:Name="tb1" 
Margin="4" 
> 
<TextBox.Style> 
<Style TargetType="TextBox" BasedOn="{StaticResource {x:Type TextBox}}"> 
    <Style.Triggers> 
     <MultiDataTrigger> 
      <MultiDataTrigger.Conditions> 
       <Condition 
       Binding="{Binding Tag, ElementName=Button1MouseDetector}" 
       Value="MouseOver" 
       /> 
       <Condition 
       Binding="{Binding IsEnabled, ElementName=button1}" 
       Value="False" 
       /> 
      </MultiDataTrigger.Conditions> 
      <Setter Property="BorderBrush" Value="Red" /> 
     </MultiDataTrigger> 
     <MultiDataTrigger> 
      <MultiDataTrigger.Conditions> 
       <Condition 
       Binding="{Binding Tag, ElementName=Button2MouseDetector}" 
       Value="MouseOver" 
       /> 
       <Condition 
       Binding="{Binding IsEnabled, ElementName=button2}" 
       Value="False" 
       /> 
      </MultiDataTrigger.Conditions> 
      <Setter Property="BorderBrush" Value="Green" /> 
     </MultiDataTrigger> 
    </Style.Triggers> 
</Style> 
</TextBox.Style> 
</TextBox> 
</StackPanel> 
+0

可能给Button1的样式与设置标签的东西鼠标悬停时,再给予势必button1.Tag和button1.IsEnabled其他人的风格multitriggers触发。其他人也有类似的交易。 –

+0

如果你可以提供一些很棒的代码。不想输入那么多 – lokusking

+0

@EdPlunkett,对你来说:-) lokusking是快速的:-)。 但它只能在按钮处于禁用状态时触发......? – Legends

回答

1

这是局部的,但说明了如何

  1. 公开一个可能禁用的鼠标悬停状态控制到其他控件上的XAML风格触发器,并且

  2. 这些其他XAML触发器如何才能在两种不同条件都为真时才能执行某些操作。

XAML:

<StackPanel Orientation="Vertical"> 
    <CheckBox 
     x:Name="EnableButton1CheckBox" 
     Content="Enable Button1" 
     Margin="4" 
     /> 
    <Grid 
     Margin="4" 
     > 
     <Button 
      Content="Button1" 
      x:Name="button1" 
      IsEnabled="{Binding IsChecked, ElementName=EnableButton1CheckBox}" 
      > 
     </Button> 
     <!-- 
     When button1 is disabled, it can't receive mouse events, so we create a 
     coextensive control that's explicitly transparent. If it merely had no 
     background specified, it wouldn't get mouse events either. 
     --> 
     <Border 
      x:Name="Button1MouseDetector" 
      Background="Transparent" 
      > 
      <Border.Style> 
       <Style TargetType="Border"> 
        <Style.Triggers> 
         <Trigger Property="IsMouseOver" Value="True"> 
          <Setter Property="Tag" Value="MouseOver" /> 
         </Trigger> 
        </Style.Triggers> 
       </Style> 
      </Border.Style> 
     </Border> 
    </Grid> 

    <Button 
     Content="Button2" 
     x:Name="button2" 
     Margin="4" 
     > 
     <Button.Style> 
      <Style TargetType="Button" BasedOn="{StaticResource {x:Type Button}}"> 
       <Style.Triggers> 
        <MultiDataTrigger> 
         <MultiDataTrigger.Conditions> 
          <Condition 
           Binding="{Binding Tag, ElementName=Button1MouseDetector}" 
           Value="MouseOver" 
           /> 
          <Condition 
           Binding="{Binding IsEnabled, ElementName=button1}" 
           Value="False" 
           /> 
         </MultiDataTrigger.Conditions> 
         <Setter Property="BorderBrush" Value="Red" /> 
        </MultiDataTrigger> 
       </Style.Triggers> 
      </Style> 
     </Button.Style> 
    </Button> 
</StackPanel> 
+0

我正在玩你的示例,我已经改变了button2是一个文本框。当我将鼠标悬停在按钮1上时,tb2的边框变为红色。我在tb中输入了一些字符,并且鼠标悬停效果消失了,当我将鼠标悬停在按钮1上时,它不会再变成红色。 还有一个问题:Textbox2可以突出显示,当鼠标悬停在禁用的button1上并禁用button2时(如上面的帖子中所述)。 如何将Button2MouseDetector绑定到textbox2? Textbox2可以被两个按钮突出显示。 – Legends

+1

@Legends使用文本框,您可能会看到'FocusVisualStyle'覆盖您设置的边框 - 如果您创建第二个文本框(或任何可以获得焦点的对象)并将焦点移至该位置,会发生什么?或者尝试在文本框上设置FocusVisualStyle =“{x:Null}”,看看是否改变了它。 –

+1

@Legends对于textBox2风格,您将有两个触发器,第一个触发器完全按照我的示例查看Button1MouseDetector.Tag/button1.IsEnabled,另一个与第一个触发器完全相同,只是它看起来在Button2MouseDetector.Tag和button2。的IsEnabled。这就是你如何在触发器中执行“OR”:只需为其他条件制定第二个触发器即可。 –

相关问题