欢迎光临散文网 会员登陆 & 注册

WPF项目实战合集(2022终结版)

2023-08-11 14:18 作者:疾风SHINO  | 我要投稿

交一下作业,图中上方五个数据卡片使用同一模板生成,左下方五个导航卡片也使用同一模板生成,其中的数据、icon路径均从后台获取并绑定至控件中,我定义了一个类型为Object的附加属性DataContext用于外部控件与其模板间的数据传递,不清楚实际项目中会如何设计。剩下的就不做了,大同小异,继续往后面看视频了。再贴一下代码,也是边查边写的,可能会比较乱。

窗口代码:

<Window x:Class="_01WPF绑定阶段性总结作业.MainWindow"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

    xmlns:local="clr-namespace:_01WPF绑定阶段性总结作业"

    mc:Ignorable="d"

    Title="WPF内部培训训练" Height="450" Width="800">

  <Grid>

    <Grid.RowDefinitions>

      <RowDefinition Height="60"></RowDefinition>

      <RowDefinition></RowDefinition>

    </Grid.RowDefinitions>

    <Grid Grid.Row="0" Background="White">

      <!-- 第一行内容 Logo与菜单 -->

      <Grid.ColumnDefinitions>

        <ColumnDefinition Width="0.3*"></ColumnDefinition>

        <ColumnDefinition ></ColumnDefinition>

        <ColumnDefinition Width="0.2*"></ColumnDefinition>

      </Grid.ColumnDefinitions>

      <StackPanel Grid.Column="0" HorizontalAlignment="Center" VerticalAlignment="Center">

        <TextBlock Text="WPF实战训练营" FontSize="18" Foreground="Red"></TextBlock>

      </StackPanel>

      <WrapPanel Grid.Column="1" HorizontalAlignment="Right" VerticalAlignment="Center">

        <Button Style="{StaticResource MenuButtonStyle}" local:ControlAttachProperty.DataContext="{Binding MenuButtons[0]}"></Button>

        <Button Style="{StaticResource MenuButtonStyle}" local:ControlAttachProperty.DataContext="{Binding MenuButtons[1]}"></Button>

        <Button Style="{StaticResource MenuButtonStyle}" local:ControlAttachProperty.DataContext="{Binding MenuButtons[2]}"></Button>

        <Button Style="{StaticResource MenuButtonStyle}" local:ControlAttachProperty.DataContext="{Binding MenuButtons[3]}"></Button>

        <Button Style="{StaticResource MenuButtonStyle}" local:ControlAttachProperty.DataContext="{Binding MenuButtons[4]}"></Button>

      </WrapPanel>

    </Grid>

    <Grid Grid.Row="1" Background="#F3F3F3" >

      <Grid.RowDefinitions>

        <RowDefinition></RowDefinition>

        <RowDefinition></RowDefinition>

        <RowDefinition></RowDefinition>

        <RowDefinition></RowDefinition>

      </Grid.RowDefinitions>

      <Grid.ColumnDefinitions>

        <ColumnDefinition></ColumnDefinition>

        <ColumnDefinition></ColumnDefinition>

        <ColumnDefinition></ColumnDefinition>

        <ColumnDefinition></ColumnDefinition>

        <ColumnDefinition></ColumnDefinition>

      </Grid.ColumnDefinitions>

      <ContentControl Grid.Row="0" Grid.Column="0" Style="{StaticResource DataCardTemplate}" Background="#2399FD" local:ControlAttachProperty.DataContext="{Binding ScoreInfos[0]}"></ContentControl>

      <ContentControl Grid.Row="0" Grid.Column="1" Style="{StaticResource DataCardTemplate}" Background="#60B723" local:ControlAttachProperty.DataContext="{Binding ScoreInfos[1]}"></ContentControl>

      <ContentControl Grid.Row="0" Grid.Column="2" Style="{StaticResource DataCardTemplate}" Background="#FFA100" local:ControlAttachProperty.DataContext="{Binding ScoreInfos[2]}"></ContentControl>

      <ContentControl Grid.Row="0" Grid.Column="3" Style="{StaticResource DataCardTemplate}" Background="#30B8C6" local:ControlAttachProperty.DataContext="{Binding ScoreInfos[3]}"></ContentControl>

      <ContentControl Grid.Row="0" Grid.Column="4" Style="{StaticResource DataCardTemplate}" Background="#E87A6C" local:ControlAttachProperty.DataContext="{Binding ScoreInfos[4]}"></ContentControl>


      <ContentControl Grid.Row="1" Grid.Column="0" Style="{StaticResource ButtonCardTemplate}" Grid.ColumnSpan="2" Background="White" local:ControlAttachProperty.DataContext="{Binding ButtonCards[0]}"></ContentControl>

      <ContentControl Grid.Row="2" Grid.Column="0" Style="{StaticResource ButtonCardTemplate}" Background="White" local:ControlAttachProperty.DataContext="{Binding ButtonCards[1]}"></ContentControl>

      <ContentControl Grid.Row="2" Grid.Column="1" Style="{StaticResource ButtonCardTemplate}" Background="White" local:ControlAttachProperty.DataContext="{Binding ButtonCards[2]}"></ContentControl>

      <ContentControl Grid.Row="3" Grid.Column="0" Style="{StaticResource ButtonCardTemplate}" Background="White" local:ControlAttachProperty.DataContext="{Binding ButtonCards[3]}"></ContentControl>

      <ContentControl Grid.Row="3" Grid.Column="1" Style="{StaticResource ButtonCardTemplate}" Background="White" local:ControlAttachProperty.DataContext="{Binding ButtonCards[4]}"></ContentControl>

    </Grid>

  </Grid>

</Window>

模板资源代码:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

  xmlns:local="clr-namespace:_01WPF绑定阶段性总结作业">

  <Style x:Key="MenuButtonStyle" TargetType="Button">

    <Setter Property="FontSize" Value="14" />

    <Setter Property="Foreground" Value="#B9B5B2" />

    <Setter Property="Template">

      <Setter.Value>

        <ControlTemplate TargetType="Button">

          <Border x:Name="Border" Background="White"

          Width="60" Height="40" Margin="20,0,0,0">

            <Grid>

              <Grid.ColumnDefinitions>

                <ColumnDefinition/>

                <ColumnDefinition/>

              </Grid.ColumnDefinitions>

              <Image Source="{Binding Path=(local:ControlAttachProperty.DataContext).IconPath, 

                    RelativeSource={RelativeSource TemplatedParent}}" Width="16" Height="16"/>

              <TextBlock Grid.Column="1" Text="{Binding Path=(local:ControlAttachProperty.DataContext).Name, 

                    RelativeSource={RelativeSource TemplatedParent}}"

               VerticalAlignment="Center" />

            </Grid>

          </Border>

          <ControlTemplate.Triggers>

            <Trigger Property="IsMouseOver" Value="True">

              <Setter TargetName="Border" Property="Background" Value="#BBE3FE" />

            </Trigger>

          </ControlTemplate.Triggers>

        </ControlTemplate>

      </Setter.Value>

    </Setter>

  </Style>

  <Style x:Key="DataCardTemplate" TargetType="ContentControl">

    <Setter Property="Foreground" Value="White"/>

    <Setter Property="Template">

      <Setter.Value>

        <ControlTemplate TargetType="ContentControl">

          <Border Background="{TemplateBinding Background}" CornerRadius="1" Margin="10" >

            <Grid>

              <Grid.RowDefinitions>

                <RowDefinition Height="1*"></RowDefinition>

                <RowDefinition></RowDefinition>

                <RowDefinition Height="1*"></RowDefinition>

              </Grid.RowDefinitions>

              <StackPanel Grid.Row="0" VerticalAlignment="Center" Margin="10,0,0,0">

                <TextBlock Text="{Binding Path=(local:ControlAttachProperty.DataContext).Title, 

                    RelativeSource={RelativeSource TemplatedParent}}"></TextBlock>

              </StackPanel>

              <Grid Grid.Row="1" Margin="10,0,0,0">

                <Grid.ColumnDefinitions>

                  <ColumnDefinition></ColumnDefinition>

                  <ColumnDefinition></ColumnDefinition>

                </Grid.ColumnDefinitions>

                <StackPanel Grid.Column="0">

                  <TextBlock HorizontalAlignment="Left" Text="{Binding Path=(local:ControlAttachProperty.DataContext).Score, 

                    RelativeSource={RelativeSource TemplatedParent}}" FontSize="20"></TextBlock>

                </StackPanel>

                <StackPanel Grid.Column="1" HorizontalAlignment="Right" Margin="0,0,10,0">

                  <TextBlock Text="收益" HorizontalAlignment="Right"></TextBlock>

                  <TextBlock Text="{Binding Path=(local:ControlAttachProperty.DataContext).Proportion, 

                    RelativeSource={RelativeSource TemplatedParent},StringFormat=+{0}%}"></TextBlock>

                </StackPanel>

              </Grid>

              <StackPanel Grid.Row="2" HorizontalAlignment="Left" Margin="0,0,10,0" Orientation="Horizontal">

                <TextBlock Text="提现" Margin="10,0,0,0"></TextBlock>

                <TextBlock Text="充值" Margin="10,0,0,0"></TextBlock>

              </StackPanel>

            </Grid>

          </Border>

        </ControlTemplate>

      </Setter.Value>

    </Setter>

  </Style>

  <Style x:Key="ButtonCardTemplate" TargetType="ContentControl">

    <Setter Property="Template">

      <Setter.Value>

        <ControlTemplate TargetType="ContentControl">

          <Border Background="{TemplateBinding Background}" CornerRadius="1" Margin="10" >

            <Grid>

              <Grid.ColumnDefinitions>

                <ColumnDefinition Width="0.5*"/>

                <ColumnDefinition/>

              </Grid.ColumnDefinitions>

              <Image Source="{Binding Path=(local:ControlAttachProperty.DataContext).IconPath, 

                    RelativeSource={RelativeSource TemplatedParent}}" Width="20" Height="20" HorizontalAlignment="Right" Margin="0,0,10,0"/>

              <StackPanel Grid.Column="1" VerticalAlignment="Center">

                <TextBlock Text="{Binding Path=(local:ControlAttachProperty.DataContext).Message, 

                    RelativeSource={RelativeSource TemplatedParent}}"

                FontSize="15"/>

                <TextBlock Text="立即前往"

                Foreground="#BABABA" FontSize="10"/>

              </StackPanel>

            </Grid>

          </Border>

        </ControlTemplate>

      </Setter.Value>

    </Setter>

  </Style>

</ResourceDictionary>

视图模型代码:

using CommunityToolkit.Mvvm.ComponentModel;

using CommunityToolkit.Mvvm.Input;

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows;

using System.Windows.Media.Imaging;


namespace _01WPF绑定阶段性总结作业

{

  public class MainViewModel : ObservableObject

  {

    public List<MenuButton> MenuButtons { get; set; }

    public List<ScoreInfo> ScoreInfos { get; set; }

    public List<ButtonCard> ButtonCards { get; set; }

    public MainViewModel()

    {

      MenuButtons = new List<MenuButton>()

      {

        new MenuButton("用户", "icons/user.png"),

        new MenuButton("财务", "icons/金钱.png"),

        new MenuButton("积分", "icons/积分.png"),

        new MenuButton("市场", "icons/乐分市场.png"),

        new MenuButton("客服", "icons/客服.png") };

      ScoreInfos = new List<ScoreInfo>()

      {

        new ScoreInfo("现金积分",255539, 0.8f),

        new ScoreInfo("商城积分",255539, 0.8f),

        new ScoreInfo("理财积分",255539, 0.8f),

        new ScoreInfo("激活码",255539, 0.8f),

        new ScoreInfo("活跃用户",255539, 0.8f) };

      ButtonCards = new List<ButtonCard>()

      {

        new ButtonCard("icons/会员.png", "成为会员,加入我们"),

        new ButtonCard("icons/投资.png", "我要投资"),

      new ButtonCard("icons/商城.png", "积分商城"),

      new ButtonCard("icons/兑换.png", "兑换任务"),

      new ButtonCard("icons/银行卡.png", "线下充值")};

    }


  }

  public class MenuButton

  {

    public RelayCommand ShowCommand { get; }

    public MenuButton(string name, string iconPath)

    {

      Name = name;

      IconPath = iconPath;

      ShowCommand = new RelayCommand(Show);

    }

    public string Name { get; set; }

    public string IconPath { get; set; }


    void Show()

    {

      MessageBox.Show(Name);

    }

  }


  public class ScoreInfo

  {

    public string Title { get; set; }

    public string Score { get; set; }

    public float Proportion { get; set; }

    public ScoreInfo(string title,int s, float p)

    {

      Title=title;

      Score = Convert(s);

      Proportion = p;

    }

    string Convert(int s)

    {

      string re = s.ToString();

      char[] chars = re.ToCharArray();

      re = "";

      int index = 0;

      for (int i = chars.Length - 1; i >= 3; i -= 3)

      {

        re = "," + chars[i - 2] + chars[i - 1] + chars[i] + re;

        index = i - 3;

      }

      if (index > 0)

      {

        for (int i = 0; i < index + 1; i++)

        {

          re = chars[index - i] + re;

        }

      }

      else

      {

        re = re.Remove(0, 1);

      }

      return re;

    }

  }


  public class ButtonCard

  {

    public ButtonCard(string iconPath, string message)

    {

      IconPath = iconPath;

      Message = message;

    }


    public string IconPath { get; set; }

    public string Message { get; set; }

  }

}

附加属性代码:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows;

using System.Windows.Media.Imaging;


namespace _01WPF绑定阶段性总结作业

{

  public class ControlAttachProperty

  {

    #region 通用上下文

    public static readonly DependencyProperty DataContextProperty =

    DependencyProperty.RegisterAttached("DataContext", typeof(object), typeof(ControlAttachProperty), new PropertyMetadata(null));


    public static object GetDataContext(DependencyObject obj)

    {

      return (object)obj.GetValue(DataContextProperty);

    }


    public static void SetDataContext(DependencyObject obj, string value)

    {

      obj.SetValue(DataContextProperty, value);

    }

    #endregion

  }

}


WPF项目实战合集(2022终结版)的评论 (共 条)

分享到微博请遵守国家法律