如何在 uwp 中增加鼠标悬停时 gridviewitem 的大小?
How to increase the size of gridviewitem on mouse over in uwp?
通常在鼠标悬停时我们会得到一个灰色边框,突出显示鼠标悬停在 gridviewitem 上。但相反,我会稍微增加 gridviewitem 的大小,就像一点点流行一样,当鼠标离开时将其恢复到正常大小。请注意 size/pop 向上的增加不应影响其余的 gridviewitems。
我的代码目前非常基础:
<GridView x:Name="contentGV" Margin="18,10,18,18"
Width="Auto">
<GridView.ItemContainerStyle>
<Style TargetType="GridViewItem">
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
</Style>
</GridView.ItemContainerStyle>
<GridView.ItemTemplate>
<DataTemplate>
<Grid>
<StackPanel Margin="5,5,25,5" MaxWidth="145" Height="220">
<Grid Background="{Binding LogoBG}" CornerRadius="25" Height="120" Width="120">
<Border Height="120" Width="120" CornerRadius="25">
<Border.Background>
<ImageBrush ImageSource="{Binding LogoUrl}" />
</Border.Background>
</Border>
</Grid>
<TextBlock x:Name="Title"
MaxLines="2" Width="120"
Text="{Binding Title}" TextWrapping="WrapWholeWords"/>
</StackPanel>
</Grid>
</DataTemplate>
</GridView.ItemTemplate>
</GridView>
在我看来,对此没有完美的解决方案,因为如果我们对 GridViewItem 的大小进行较大的更改,则会影响其他 GridViewItem。
一个解决方法是我们可以在 DataTemplate 中更改网格的大小,这样看起来我们已经在 GridViewItem 上实现了一个弹出窗口。
但是请注意,由于GridViewItem有一个灰色的边框,而且它的大小是固定的,所以如果我们对Grid进行了大量的改动,那么GridViewItem的内容可能会被截断。如果我们根据您的灰色边框对 Grid 的大小进行一些更改,它就可以正常工作。
为了改变网格的大小,一种方法是我们可以改变网格的高度和宽度。这样就不会改变它在Grid中的其他控件的大小,例如文本的字体大小。
另一种方法是我们可以执行 CompositeTransform on the Grid and change the CompositeTransform.ScaleX and CompositeTransform.ScaleY 来拉伸或收缩网格。这样,Grid 内的其他控件也将被拉伸或收缩。
我们可以通过VisualState或者.cs代码来实现上面的需求
我创建了一个示例,通过执行 CompositeTransform on the Grid, in my example for handling the move over operation, I have used the PointerEntered event. And I use the PointerExited event to handle the move leave operation and set the CompositeTransform.ScaleX and CompositeTransform.ScaleY value as 1 to let the GridViewItem return to the normal size inside thePointerExited 事件在代码隐藏中实现它。
XAML代码:
<GridView.ItemTemplate>
<DataTemplate>
<Grid PointerEntered="Grid_PointerEntered" PointerExited="Grid_PointerExited">
……
</Grid>
</DataTemplate>
</GridView.ItemTemplate>
.CS代码:
private void Grid_PointerEntered(object sender, PointerRoutedEventArgs e)
{
Grid testGrid = sender as Grid;
testGrid.RenderTransform = new CompositeTransform() { ScaleX = 1.2, ScaleY = 1.2 };
}
private void Grid_PointerExited(object sender, PointerRoutedEventArgs e)
{
Grid testGrid = sender as Grid;
testGrid.RenderTransform = new CompositeTransform() { ScaleX = 1, ScaleY = 1 };
}
结果:
谢谢。
通常在鼠标悬停时我们会得到一个灰色边框,突出显示鼠标悬停在 gridviewitem 上。但相反,我会稍微增加 gridviewitem 的大小,就像一点点流行一样,当鼠标离开时将其恢复到正常大小。请注意 size/pop 向上的增加不应影响其余的 gridviewitems。
我的代码目前非常基础:
<GridView x:Name="contentGV" Margin="18,10,18,18"
Width="Auto">
<GridView.ItemContainerStyle>
<Style TargetType="GridViewItem">
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
</Style>
</GridView.ItemContainerStyle>
<GridView.ItemTemplate>
<DataTemplate>
<Grid>
<StackPanel Margin="5,5,25,5" MaxWidth="145" Height="220">
<Grid Background="{Binding LogoBG}" CornerRadius="25" Height="120" Width="120">
<Border Height="120" Width="120" CornerRadius="25">
<Border.Background>
<ImageBrush ImageSource="{Binding LogoUrl}" />
</Border.Background>
</Border>
</Grid>
<TextBlock x:Name="Title"
MaxLines="2" Width="120"
Text="{Binding Title}" TextWrapping="WrapWholeWords"/>
</StackPanel>
</Grid>
</DataTemplate>
</GridView.ItemTemplate>
</GridView>
在我看来,对此没有完美的解决方案,因为如果我们对 GridViewItem 的大小进行较大的更改,则会影响其他 GridViewItem。
一个解决方法是我们可以在 DataTemplate 中更改网格的大小,这样看起来我们已经在 GridViewItem 上实现了一个弹出窗口。
但是请注意,由于GridViewItem有一个灰色的边框,而且它的大小是固定的,所以如果我们对Grid进行了大量的改动,那么GridViewItem的内容可能会被截断。如果我们根据您的灰色边框对 Grid 的大小进行一些更改,它就可以正常工作。
为了改变网格的大小,一种方法是我们可以改变网格的高度和宽度。这样就不会改变它在Grid中的其他控件的大小,例如文本的字体大小。
另一种方法是我们可以执行 CompositeTransform on the Grid and change the CompositeTransform.ScaleX and CompositeTransform.ScaleY 来拉伸或收缩网格。这样,Grid 内的其他控件也将被拉伸或收缩。
我们可以通过VisualState或者.cs代码来实现上面的需求
我创建了一个示例,通过执行 CompositeTransform on the Grid, in my example for handling the move over operation, I have used the PointerEntered event. And I use the PointerExited event to handle the move leave operation and set the CompositeTransform.ScaleX and CompositeTransform.ScaleY value as 1 to let the GridViewItem return to the normal size inside thePointerExited 事件在代码隐藏中实现它。
XAML代码:
<GridView.ItemTemplate>
<DataTemplate>
<Grid PointerEntered="Grid_PointerEntered" PointerExited="Grid_PointerExited">
……
</Grid>
</DataTemplate>
</GridView.ItemTemplate>
.CS代码:
private void Grid_PointerEntered(object sender, PointerRoutedEventArgs e)
{
Grid testGrid = sender as Grid;
testGrid.RenderTransform = new CompositeTransform() { ScaleX = 1.2, ScaleY = 1.2 };
}
private void Grid_PointerExited(object sender, PointerRoutedEventArgs e)
{
Grid testGrid = sender as Grid;
testGrid.RenderTransform = new CompositeTransform() { ScaleX = 1, ScaleY = 1 };
}
结果:
谢谢。