• wpf触发与模板的使用示例:批量生产工具


    批量生产工具

    在这里插入图片描述

    <Window x:Class="WpfM20UpdateFW.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:WpfM20UpdateFW"
            mc:Ignorable="d"
            Title="FT_MultiUart Tool V2.7   " Height="600" Width="800" WindowState="Maximized"  Closed="Window_Closed" KeyDown="Window_KeyDown" Loaded="Window_Loaded">
    
        <Window.Resources>
            <RoutedUICommand x:Key="download" Text="download"/>
            <RoutedUICommand x:Key="download_concel" Text="download_concel"/>
            <RoutedUICommand x:Key="settings" Text="settings"/>
        Window.Resources>
        <Window.InputBindings>
            <KeyBinding Gesture="Alt+D" Key="D"  Command="{StaticResource download}">KeyBinding>
            <KeyBinding Gesture="Alt+C" Key="C"  Command="{StaticResource download_concel}">KeyBinding>
            <KeyBinding Gesture="Alt+S" Key="S"  Command="{StaticResource settings}">KeyBinding>
    
        Window.InputBindings>
        <Window.CommandBindings>
            <CommandBinding Command="{StaticResource download}" CanExecute="Button_Click_Download">CommandBinding>
            <CommandBinding Command="{StaticResource download_concel}" CanExecute="Button_Click_DownloadCancel">CommandBinding>
            <CommandBinding Command="{StaticResource settings}" CanExecute="Button_Click_Settings">CommandBinding>
        Window.CommandBindings>
    
        <Grid ShowGridLines="false" MinWidth="20" FocusManager.FocusedElement="{Binding ElementName=download}" Grid.ColumnSpan="4">
            <Grid.RowDefinitions>
                <RowDefinition  Height="30">RowDefinition>
                <RowDefinition  Height="*">RowDefinition>
    
            Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="0.1*">ColumnDefinition>
                <ColumnDefinition Width="0.1*">ColumnDefinition>
                <ColumnDefinition Width="0.1*">ColumnDefinition>
                <ColumnDefinition Width="0.1*">ColumnDefinition>
            Grid.ColumnDefinitions>
            
            <Button Grid.Row="0" Grid.Column="0" FontSize="20" FontWeight="Bold" Margin="5,0,5,0"  x:Name="settings" Click="Button_Click_Settings">SettingsButton>
            <Button Grid.Row="0" Grid.Column="3" FontSize="20" FontWeight="Bold" Margin="50,0,5,0" x:Name="download" IsDefault="True" Click="Button_Click_Download" >StartButton>
            <TextBlock Grid.Row="0" Grid.Column="1"  Grid.ColumnSpan="2" x:Name="textBlockDevice" FontFamily="黑体" FontSize="25" HorizontalAlignment="Center" VerticalAlignment="Center" Text="{Binding DeviceCount}"/>
    
            <ListBox x:Name="myListBox" Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="4">
                <ListBox.ItemsPanel>
                    <ItemsPanelTemplate>
                        <WrapPanel Orientation="Horizontal" IsItemsHost="True"/>
                    ItemsPanelTemplate>
                ListBox.ItemsPanel>
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel x:Name="myStackPanel" Orientation="Vertical" Background="AliceBlue" Margin="1 0 0 0" Width="300" Height="{Binding ActualHeight, ElementName=myListBox, Mode=OneWay}">
                            <TextBlock x:Name="myCom" FontFamily="黑体" FontSize="25" HorizontalAlignment="Center" VerticalAlignment="Center">
                                <TextBlock.Text >
                                    <MultiBinding StringFormat="{}COM{0,-4}">
                                        <Binding Path="Name"/>
                                    MultiBinding>
                                TextBlock.Text>
                            TextBlock>
    
    
                            <DataGrid x:Name="myDataGrid" AutoGenerateColumns="True"  MaxHeight="400"  ItemsSource="{Binding DataGridCollection}">
                                <DataGrid.RowStyle>
                                    <Style TargetType="DataGridRow">
                                        "Background" Value="White" />
                                        
                                            
                                            "{Binding Row[状态]}" Value="PASS">
                                                "Background" Value="Green" />
                                            
                                            "{Binding Row[状态]}" Value="FAIL">
                                                "Background" Value="Red" />
                                            
                                            "{Binding Row[状态]}" Value="SKIP">
                                                "Background" Value="Gray" />
                                            
                                        
                                    Style>
                                DataGrid.RowStyle>
                            DataGrid>
    
    
    
                            <TextBlock x:Name="myStatus" Text="{Binding Path=Status}" FontFamily="黑体" FontSize="40"  FontWeight="Bold" HorizontalAlignment="Center" VerticalAlignment="Center">
                                <TextBlock.Style>
                                    <Style TargetType="TextBlock">
                                        "Foreground" Value="White" />
                                        
                                            
                                            "{Binding Status}" Value="PASS">
                                                "Foreground" Value="Green" />
                                            
                                            "{Binding Status}" Value="FAIL">
                                                "Foreground" Value="Red" />
                                            
                                            "{Binding Status}" Value="SKIP">
                                                "Foreground" Value="Gray" />
                                            
                                            "{Binding Status}" Value="READY">
                                                "Foreground" Value="Black" />
                                            
                                        
                                    Style>
                                TextBlock.Style>
                            TextBlock>
                            <TextBox x:Name="myLog" Text="{Binding Path=Log}" MinHeight="100" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto" AcceptsReturn="True" IsReadOnly="True" VerticalContentAlignment="Stretch" HorizontalContentAlignment="Stretch" />
                        StackPanel>
                    DataTemplate>
                ListBox.ItemTemplate>
            ListBox>
    
    
            
    
    
            
    
    
    
        Grid>
    Window>
    
    

    还是不习惯数据绑定的方式,总是想用getcontrol先获取控件,再对控件进行处理。我注释后,绑定也很方便!!!

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        DataTable dataTable = new DataTable();
        dataTable.Columns.Add("序号", typeof(int));
        dataTable.Columns.Add("测试项", typeof(string));
        dataTable.Columns.Add("状态", typeof(string));
        dataTable.Columns.Add("值", typeof(string));
    
    
        for (int j = 1; j <= 40; j++)
        {
                dataTable.Rows.Add(j, "读SN", j < 10?"PASS":"FAIL","FT123456789");
        }
        for (int i = 0; i < bindingList.Count; i++)
        {
            //TextBlock myCom = (TextBlock)MyAPI.getControl(myListBox, i, "myCom");
    
            //DataGrid myDataGrid = (DataGrid)MyAPI.getControl(myListBox, i, "myDataGrid");
            //if (myDataGrid != null)
            //{
            //    myDataGrid.ItemsSource = dataTable.DefaultView;
            //}
            bindingList[i].DataGridCollection = dataTable.DefaultView;
    
    
            //TextBlock myStatus = (TextBlock)MyAPI.getControl(myListBox, i, "myStatus");
            //myStatus.Text = "PASS";
            bool b = true;
            for (int k = 0; k < dataTable.Rows.Count; k++) {
                if (dataTable.Rows[k]["状态"].Equals("FAIL"))
                {
                    b = false;
                }
            }
            bindingList[i].Status = b?"PASS":"FAIL";
    
            //TextBlock myLog = (TextBlock)MyAPI.getControl(myListBox, i, "myLog");
            //myLog.Text = "测试完成";
    
            bindingList[i].Log = "测试完成";
        }
    }
    

    触发示例:多种状态对应不同颜色

    DataTrigger 可以设置多种状态,每种状态对应不同的颜色。你可以为 DataGridRow 设置多个 DataTrigger,根据不同的条件更改行的颜色。假设你有一个 Status 列,不同的状态对应不同的颜色,比如 “Green”、“Yellow”、“Red” 等。

    示例:多种状态对应不同颜色

    假设 DataTable 中有一个 Status 列,根据 Status 的值来设置不同的背景颜色。

    1. 创建 DataTable 并绑定到 DataGrid
    // 创建 DataTable
    DataTable table = new DataTable();
    table.Columns.Add("Name", typeof(string));
    table.Columns.Add("Status", typeof(string)); // 状态列,用于改变颜色
    
    // 添加示例数据
    table.Rows.Add("Item 1", "Green");  // 对应绿色
    table.Rows.Add("Item 2", "Yellow"); // 对应黄色
    table.Rows.Add("Item 3", "Red");    // 对应红色
    
    // 绑定到 DataGrid
    myDataGrid.ItemsSource = table.DefaultView;
    
    2. 在 XAML 中定义 DataGridRowStyle

    使用多个 DataTrigger 为不同的状态设置不同的行背景颜色:

    <DataGrid x:Name="myDataGrid" AutoGenerateColumns="True">
        <DataGrid.RowStyle>
            <Style TargetType="DataGridRow">
                "Background" Value="White" /> 
                
                    
                    "{Binding Path=Row[Status]}" Value="Green">
                        "Background" Value="LightGreen" />
                    
                    
                    "{Binding Path=Row[Status]}" Value="Yellow">
                        "Background" Value="Yellow" />
                    
                    
                    "{Binding Path=Row[Status]}" Value="Red">
                        "Background" Value="Salmon" />
                    
                    
                
            Style>
        DataGrid.RowStyle>
    DataGrid>
    

    3. 动态修改 DataTable 行状态

    你可以在代码中动态修改 Status 列的值来触发颜色变化:

    // 将第一行的状态设置为 "Red",触发行背景变为红色
    table.Rows[0]["Status"] = "Red";
    

    解释

    • Path=Row[Status]:绑定到 DataRowViewRow 属性中的 Status 列。
    • 每个 DataTrigger 针对 Status 列的不同值设置不同的背景颜色。
    • 你可以根据需要添加更多的 DataTrigger,为更多的状态设置不同的颜色。

    这样,你可以通过修改 DataTable 中的状态值,动态控制 DataGrid 中行的颜色变化。

  • 相关阅读:
    贴近摄影测量,如何让平遥古城焕发生机?
    Python数据分析与机器学习33-K-Means实例
    苹果开发者 Xcode发布TestFlight全流程
    古建筑测绘任重道远,三维实景建模是唯一突破口?
    微型计算机的组成
    吴军老师的《计算之魂》部分重点摘要
    分布式物联网平台特点
    触摸屏如何利用无线PPI通信模块远程采集PLC数据?
    dht11温湿度传感器工作原理引脚功能电路接线图
    深入讲解C++基础知识(一)
  • 原文地址:https://blog.csdn.net/chenhao0568/article/details/142176883