WPF

时间:2018-02-04 19:39:27

标签: c# wpf xaml mvvm

我有一个非常简单的操作 - 每当用户将鼠标悬停在矩形上时,它应该改变其他矩形的颜色。现在就是这样做的:

<Rectangle Panel.ZIndex="3" Height="30" Width="30" HorizontalAlignment="Right" VerticalAlignment="Top" MouseEnter="Rectangle_MouseEnter" MouseLeave="Rectangle_MouseLeave">
    <Rectangle.Fill>
        <ImageBrush ImageSource="/Images/close.ico"/>
    </Rectangle.Fill>
</Rectangle>

<Rectangle Panel.ZIndex="2" Height="30" Width="30" HorizontalAlignment="Right" VerticalAlignment="Top" Name="ExitSquare">
    <Rectangle.Fill>
        <SolidColorBrush Color="#f9b129"/>
    </Rectangle.Fill>
</Rectangle>
private void Rectangle_MouseEnter(object sender, MouseEventArgs e)
{
    ExitSquare.Fill = new SolidColorBrush(Color.FromRgb(251, 200, 106));
}

private void Rectangle_MouseLeave(object sender, MouseEventArgs e)
{
    ExitSquare.Fill = new SolidColorBrush(Color.FromRgb(249, 177, 41));
}

我想知道 - 如果我的目标是使用MVVM模式,可能有更好的选择吗?尝试绑定MouseEnter和MouseLeave事件并使它们在我的ViewModel的私有成员上操作是不是一个好主意,该成员将绑定到矩形的颜色,或者只会使事情变得不必要地复杂化?

3 个答案:

答案 0 :(得分:0)

为了使其成为MVVM,您可以使用ViewModel将这两个MouseEvent绑定到EventToCommand,这是Blend SDK的一部分,通过此命名空间:

http://schemas.microsoft.com/expression/2010/interactivity

这里有一个NuGet包:https://www.nuget.org/packages/Expression.Blend.Sdk/

如何使用它的示例:

<Rectangle Panel.ZIndex="3" Height="30" Width="30" HorizontalAlignment="Right" VerticalAlignment="Top">
    <Rectangle.Fill>
        <ImageBrush ImageSource="/Images/close.ico"/>
    </Rectangle.Fill>
     <i:Interaction.Triggers>
        <i:EventTrigger EventName="MouseEnter">
            <i:InvokeCommandAction Command="{Binding MouseEnterCommand}" />
        </i:EventTrigger>
        <i:EventTrigger EventName="MouseLeave">
            <i:InvokeCommandAction Command="{Binding MouseLeaveCommand}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
</Rectangle>

真正的问题是,为什么你想要 MVVM ?这是你要进行单元测试的吗? IMO,因为这只需要处理美学,所以在代码隐藏中这样做是完全可以的,因为它不处理任何数据,计算,状态等。

答案 1 :(得分:0)

您既不需要视图模型也不需要代码中的任何事件处理程序。

在另一个Rectangle的IsMouseOver属性上使用DataTrigger的样式就足够了:

a -> m a

答案 2 :(得分:-1)

此样式设置为可用于您的应用程序。

<Button>
    <Button.Style>
        <Style TargetType="{x:Type Button}">
            <Style.Setters>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type Button}">
                            <Border Width="{TemplateBinding Width}" Height="{TemplateBinding Height}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}">
                                <ContentPresenter />
                            </Border>
                            <ControlTemplate.Triggers>
                                <Trigger Property="IsMouseOver" Value="True">
                                    <Trigger.Setters>
                                        <Setter Property="Background" Value="Black" />
                                    </Trigger.Setters>
                                </Trigger>
                                <Trigger Property="IsMouseOver" Value="False">
                                    <Trigger.Setters>
                                        <Setter Property="Background">
                                            <Setter.Value>
                                                <ImageBrush ImageSource="/Images/close.ico"/>
                                            </Setter.Value>
                                        </Setter>
                                    </Trigger.Setters>
                                </Trigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style.Setters>
        </Style>
    </Button.Style>
</Button>