WPF—QQ界面(五):QQ好友分组列表的效果实现 及 截稿

效果分析:

1、鼠标左键单击 分组 的组名,能够弹出一个下拉列表,并且左边的向右箭头转成向下;

2、弹出的下拉列表中包含好友的头像,好友的昵称,还有好友的个性签名或最新动态;

3、当鼠标移到好友这一行,能够将一行的背景色置蓝或置橙;

4、当鼠标移到好友的头像上,能够悬浮显示好友的个人信息。

除了这些基本的效果,还有很多效果蕴含其中。。。。感觉分组列表的效果最难做。

我大致做出了那样的效果,很不美观。没达到一样的效果,就不分析思路了,以免误人子弟。

用的是ScrollViewer

前台:

<ScrollViewer VerticalScrollBarVisibility="Auto" Margin="8,0,10,10" Background="Transparent">
                <ScrollViewer.Content>
                    <StackPanel Width="230" Orientation="Vertical" HorizontalAlignment="Left" VerticalAlignment="Top" Name="FriendListControl"/>
                </ScrollViewer.Content>
            </ScrollViewer>

后台:

private void Window_Loaded(object sender,RoutedEventArgs e)
        {
            Test.GetGroupList().ToList().ForEach(s =>
            {
                Expander t = new Expander();
                t.Header = s;
                t.HeaderTemplate = this.FindResource("ExpanderHeaderTemplate") as DataTemplate;
                ListView v = new ListView();
                v.ItemsSource = s.Children;
                v.Width = 280;
                v.BorderThickness = new Thickness(0);
                v.ItemTemplate = this.FindResource("FriendList") as DataTemplate;
                v.SelectionMode = SelectionMode.Single;
                t.Content = v;
                FriendListControl.Children.Add(t);
                //object obj = this.FindResource("TextBlockStateStyle");
                
            });
        }

后台代码中出现了几个自定义的资源字典,包括 ExpanderHeaderTemplate  和  FriendList 。

资源字典 (ResourceDictionary)代码如下:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <DataTemplate x:Key="FriendList">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="20"/>
                <RowDefinition Height="20"/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="40"/>
                <ColumnDefinition Width="130"/>
            </Grid.ColumnDefinitions>
            <Image Grid.Column="0" Grid.RowSpan="2" Source="NewFolder/basicQQ.jpg"/>  <!--好友列表的头像图片-->
            <TextBlock Text="{Binding Path=Name}" Margin="5,1,0,1" Grid.Column="1" Grid.Row="0" TextAlignment="Left"/>
            <TextBlock Text="{Binding Path=Signature}" Margin="5,1,0,1" Grid.Column="1" Grid.Row="1" TextAlignment="Left"/>
        </Grid>
    </DataTemplate>
    <DataTemplate x:Key="ExpanderHeaderTemplate">
        <WrapPanel>
            <TextBlock Text="{Binding Path=Name}" TextAlignment="Left"></TextBlock>
            <TextBlock Text="[" TextAlignment="Left"></TextBlock>
            <TextBlock Text="{Binding Path=OnlineFriendNum}" TextAlignment="Left"></TextBlock>
            <TextBlock Text="/" TextAlignment="Left"></TextBlock>
            <TextBlock Text="{Binding Path=TotalFriendNum}" TextAlignment="Left"></TextBlock>
            <TextBlock Text="]" TextAlignment="Left"></TextBlock>
        </WrapPanel>
    </DataTemplate>
    <Style x:Key="TextBlockStateStyle" TargetType="{x:Type TextBlock}">
        <Setter Property="FontFamily" Value="宋体"/>
        <Setter Property="FontSize" Value="18"/>
        <Setter Property="Foreground" Value="#FF000000"/>
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="BitmapEffect">
                    <Setter.Value>
                        <OuterGlowBitmapEffect GlowSize="3" GlowColor="#FFFFFF"/>
                    </Setter.Value>
                </Setter>
            </Trigger>
        </Style.Triggers>
    </Style>
</ResourceDictionary>

最后那个 DataTemplate 多余了,TextBlockStateStyle 请自行忽略。

 最终效果图:

最后附上我在github上的源码地址:https://github.com/Danieldong0802/QQpresentation  

虽是半成品,也是花上我这个初学者的好多时间才完成的,很多不足之处,望各位前辈指教!

转载于:https://www.cnblogs.com/danieldong/p/5342853.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现带全选复选框的列表控件,可以使用WPF中的ListView控件和GridViewColumnHeader控件来实现。 首先,在ListView中添加一个CheckBox列作为全选复选框,可以使用GridViewColumnHeader控件来实现。在该控件的Click事件中,可以遍历ListView中的所有数据项,并将其对应的CheckBox控件的IsChecked属性设置为GridViewColumnHeader的IsChecked属性值。 以下是一个简单的示例代码: ```xml <ListView> <ListView.View> <GridView> <GridViewColumn> <GridViewColumnHeader Click="GridViewColumnHeader_Click"> <CheckBox x:Name="chkSelectAll" /> </GridViewColumnHeader> </GridViewColumn> <GridViewColumn Header="姓名" DisplayMemberBinding="{Binding Name}" /> <GridViewColumn Header="年龄" DisplayMemberBinding="{Binding Age}" /> <GridViewColumn Header="性别" DisplayMemberBinding="{Binding Gender}" /> </GridView> </ListView.View> </ListView> ``` ```csharp private void GridViewColumnHeader_Click(object sender, RoutedEventArgs e) { foreach (var item in listView.Items) { var container = listView.ItemContainerGenerator.ContainerFromItem(item) as ListViewItem; var checkBox = FindVisualChild<CheckBox>(container); checkBox.IsChecked = chkSelectAll.IsChecked; } } private T FindVisualChild<T>(DependencyObject obj) where T : DependencyObject { if (obj != null) { for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++) { var child = VisualTreeHelper.GetChild(obj, i); if (child != null && child is T) return (T)child; var childOfChild = FindVisualChild<T>(child); if (childOfChild != null) return childOfChild; } } return null; } ``` 在上面的示例代码中,FindVisualChild方法用于查找ListViewItem中的CheckBox控件。可以将该方法封装成一个扩展方法,以便在其他地方重复使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值