主頁 > .NET開發 > WPF教程十五:資料模板的使用(重發)

WPF教程十五:資料模板的使用(重發)

2021-06-09 15:01:06 .NET開發

資料模板

資料模板是一段如何顯示系結在VM物件的XAML代碼,資料模板可以包含任意元素的組合,基于Binding來顯示不同的資訊,

在實際的開發中資料模板的應用場景很多,同樣一個控制元件可以根據不同的系結源,根據以設定好的資料模板可以顯示對應的不同的內容,

很多人用不好控制元件模板和資料模板,覺得有點混亂,大部分都是在追求7天入門WPF,或者直接就問有沒有快速解決我目前問題的辦法,等等,我也沒有,但是資料模板其實比控制元件模板更好寫,因為他的思路比較簡單,就是這個資料,通過Binding后,界面上要顯示成什么樣,就這樣,然后我們基于這個理解來延伸內容,

首先創建一個用于顯示串列的ListBox我們模仿商店出售的商品,為了便于理解,所有的布局我都使簡單的grid分割不涉及其他布局,

  <ListBox Name="ProductsListBox" MaxWidth="290" HorizontalContentAlignment="Stretch">
            <ListBox.ItemTemplate>
                <DataTemplate> 
                        <Border Margin="5" CornerRadius="5" BorderThickness="1" BorderBrush="SteelBlue">
                            <Grid>
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="Auto"/>
                                    <RowDefinition Height="Auto"/>
                                    <RowDefinition/>
                                </Grid.RowDefinitions>
                                <TextBlock Margin="3" FontWeight="Bold" Text="{Binding Path=Name}"/> 
                                <Grid Grid.Row="1">
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="Auto"/>
                                        <ColumnDefinition Width="*"/>
                                    </Grid.ColumnDefinitions>
                                    <Grid>
                                        <Grid.ColumnDefinitions>
                                            <ColumnDefinition Width="Auto"/>
                                            <ColumnDefinition Width="*"/>
                                        </Grid.ColumnDefinitions>
                                        <TextBlock  Text="單價:"/>
                                        <TextBlock Grid.Column="1" Text="{Binding Path=Price}"/> 
                                    </Grid>
                                    <Grid Margin="1,0" Grid.Column="1">
                                        <Grid.ColumnDefinitions>
                                            <ColumnDefinition Width="Auto"/>
                                            <ColumnDefinition Width="*"/>
                                        </Grid.ColumnDefinitions>
                                        <TextBlock Text="剩余數量:"/>
                                        <TextBlock Grid.Column="1" Text="{Binding Path=Number}"/>
                                    </Grid>
                                </Grid>  
                            </Grid> 
                        </Border>  
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

我們在ListBox中定義了ItemTemplate的DataTemplate,DataTemplate會再ListBox的ItemsSource系結資料源后,拿出在DataTemplate中Binding的值,然后按照我們當前得DataTemplate來渲染,

我們定義在ItemTemplate下的資料模板,就是修改ListBox中的子物件如何顯示,

完成代碼如下:

xaml代碼

<Window x:
        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:HowtoUseDataTemplate"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition  Width="auto"/>
            <ColumnDefinition Width="6*"/>
        </Grid.ColumnDefinitions>
        <ListBox Name="ProductsListBox" MaxWidth="290" HorizontalContentAlignment="Stretch">
            <ListBox.ItemTemplate>
                <DataTemplate> 
                        <Border Margin="5" CornerRadius="5" BorderThickness="1" BorderBrush="SteelBlue">
                            <Grid>
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="Auto"/>
                                    <RowDefinition Height="Auto"/>
                                    <RowDefinition/>
                                </Grid.RowDefinitions>
                                <TextBlock Margin="3" FontWeight="Bold" Text="{Binding Path=Name}"/> 
                                <Grid Grid.Row="1">
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="Auto"/>
                                        <ColumnDefinition Width="*"/>
                                    </Grid.ColumnDefinitions>
                                    <Grid>
                                        <Grid.ColumnDefinitions>
                                            <ColumnDefinition Width="Auto"/>
                                            <ColumnDefinition Width="*"/>
                                        </Grid.ColumnDefinitions>
                                        <TextBlock  Text="單價:"/>
                                        <TextBlock Grid.Column="1" Text="{Binding Path=Price}"/> 
                                    </Grid>
                                    <Grid Margin="1,0" Grid.Column="1">
                                        <Grid.ColumnDefinitions>
                                            <ColumnDefinition Width="Auto"/>
                                            <ColumnDefinition Width="*"/>
                                        </Grid.ColumnDefinitions>
                                        <TextBlock Text="剩余數量:"/>
                                        <TextBlock Grid.Column="1" Text="{Binding Path=Number}"/>
                                    </Grid>
                                </Grid>  
                            </Grid> 
                        </Border>  
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
        <Border Margin="3" DataContext="{Binding ElementName=ProductsListBox,Path=SelectedItem}" Grid.Column="1" BorderBrush="AntiqueWhite" BorderThickness="1" CornerRadius="3">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto"></ColumnDefinition>
                    <ColumnDefinition></ColumnDefinition>
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"></RowDefinition>
                    <RowDefinition Height="Auto"></RowDefinition>
                    <RowDefinition Height="Auto"></RowDefinition>
                    <RowDefinition Height="Auto"></RowDefinition>
                    <RowDefinition Height="*"></RowDefinition>
                </Grid.RowDefinitions>
                <TextBlock  Text="名稱:"/>
                <TextBlock Grid.Column="1" Text="{Binding Name}"/>
                <TextBlock Grid.Row="1" Text="單價:"/>
                <TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding Price}"/>
                <TextBlock Grid.Row="2" Text="數量:"/>
                <TextBlock Grid.Row="2" Grid.Column="1" Text="{Binding Number}"/>
                <TextBlock Grid.Row="3" Text="介紹:"/>
                <TextBlock Grid.Row="3" Grid.Column="1" Text="{Binding Introduce}"/>
            </Grid> 
        </Border>
    </Grid>
</Window>

cs代碼如下:

using System.Collections.Generic;
using System.Windows;

namespace HowtoUseDataTemplate
{
    /// <summary>
    /// MainWindow.xaml 的互動邏輯
    /// </summary>
    public partial class MainWindow : Window
    {
        List<Product> products;
        public MainWindow()
        {
            InitializeComponent();
            products = new List<Product>()
            {
            new Product(){Name="火箭彈",Price=1000.00M, Number=5000,Introduce="這玩意要買大量的,便宜又方便、一次齊發,基本上就完成任務了,就是誤差有點大,"},
            new Product(){Name="自動步槍(洗掉敏感字眼)",Price=300.00M, Number=5000 ,Introduce="單兵裝備"},
            new Product(){ Name="爆震彈",Price=50.00M, Number=5000 ,Introduce="單兵裝備"},
            new Product(){Name="防彈衣",Price=100.00M, Number=5000,Introduce="單兵裝備"},
            new Product(){ Name="防彈頭盔",Price=80.00M, Number=5000,Introduce="單兵裝備"},
             new Product(){ Name="特別特別硬之真防彈頭盔",Price=99999.00M, Number=5000,Introduce="單兵裝備名字特別長"},
            };
            ProductsListBox.ItemsSource = products;
        }
    }

    public class Product
    {
        public int Number { get; set; }
        public string Name { get; set; }

        public decimal Price { get; set; }

        public string Introduce { get; set; }
    }
}

資料模板中還有一些常用比較方便的功能,比如資料觸發器,和轉換器,之前講過,在之前講了屬性觸發器、事件觸發器,但是資料觸發器沒講,這里講一下,

(洗掉敏感字眼) 舉個例子,火箭彈熱賣了,我們虛擬出來的軟體產品既然包含了這些,產品經理就提出來要添加一個熱賣產品的提醒功能,在產品名稱旁邊添加一個熱賣品的紅色hot斜體的文字顯示,同時文字也要變成紅色,

回想到我們剛才的資料模板,使用資料觸發器來實作熱賣品顯示hot功能,在物體中添加是否是熱賣品屬性,實作轉換器、實作資料觸發器,

1)再工程下添加Converter檔案夾

撰寫HotBoolToVisibilityConverter類,代碼如下:

using System;
using System.Globalization;
using System.Windows;
using System.Windows.Data;

namespace HowtoUseDataTemplate.Converter
{
    public class HotBoolToVisibilityConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value is bool b)
            {
                if (b)
                {
                    return Visibility.Visible;
                }
               
            }
            return Visibility.Collapsed;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}

回到主表單找到Priduct類,添加IsHot屬性,設定默認值為false,

再Products中設定每個物件是否是熱賣,完整代碼如下:

using System.Collections.Generic;
using System.Windows;

namespace HowtoUseDataTemplate
{
    /// <summary>
    /// MainWindow.xaml 的互動邏輯
    /// </summary>
    public partial class MainWindow : Window
    {
        List<Product> products;
        public MainWindow()
        {
            InitializeComponent();
            products = new List<Product>()
            {
            new Product(){Name="火箭彈",IsHot=true, Price=1000.00M, Number=5000,Introduce="這玩意要買大量的,便宜又方便、一次齊發,基本上就完成任務了,就是誤差有點大,"},
            new Product(){Name="自動步槍(洗掉敏感字眼)",Price=300.00M, Number=5000 ,Introduce="單兵裝備"},
            new Product(){ Name="爆震彈",Price=50.00M, Number=5000 ,Introduce="單兵裝備"},
            new Product(){Name="防彈衣",Price=100.00M, Number=5000,Introduce="單兵裝備"},
            new Product(){ Name="防彈頭盔",Price=80.00M, Number=5000,Introduce="單兵裝備"},
             new Product(){ Name="特別特別硬之真防彈頭盔",Price=99999.00M, Number=5000,Introduce="單兵裝備名字特別長"},
            };
            ProductsListBox.ItemsSource = products;
        }
    }

    public class Product
    {
        public int Number { get; set; }
        public string Name { get; set; }

        public decimal Price { get; set; }

        public string Introduce { get; set; }

        public bool IsHot { get; set; } = false;
    }
}

最后回到主表單的XAML檔案下,添加轉換器的參考和資源,

 xmlns:converter="clr-namespace:HowtoUseDataTemplate.Converter"
    <Window.Resources>
        <converter:HotBoolToVisibilityConverter x:Key="HotBoolToVisibilityConverter"/>
    </Window.Resources>

找到資料模板中的商品名稱,重新設計Grid布局并添加一個hot文本控制元件,

<Grid>
      <Grid.ColumnDefinitions>
      <ColumnDefinition Width="Auto"/>
      <ColumnDefinition Width="*"/>
      </Grid.ColumnDefinitions>
      <TextBlock x:Name="NameTextBlock" Margin="3" FontWeight="Bold" Text="{Binding Path=Name}"/>
      <TextBlock Margin="0,2,2,2" Visibility="{Binding IsHot,Converter={StaticResource HotBoolToVisibilityConverter}}" FontSize="10" Grid.Column="1" FontStyle="Italic" Text="Hot" Foreground="Red"/>
</Grid>

寫一個資料觸發器,當IsHot等于true的時候,去找模板中Name=NameText的控制元件,設定他的Foreground顏色屬性為紅色,

   <DataTemplate.Triggers>
                        <DataTrigger Binding="{Binding Path=IsHot}" Value="https://www.cnblogs.com/duwenlong/p/True">
                            <Setter Property="TextBlock.Foreground" TargetName="NameTextBlock" Value="https://www.cnblogs.com/duwenlong/p/Red"/>
                        </DataTrigger>
                    </DataTemplate.Triggers>

XAML完整代碼如下:

<Window x:
        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:converter="clr-namespace:HowtoUseDataTemplate.Converter"
        xmlns:local="clr-namespace:HowtoUseDataTemplate"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Window.Resources>
        <converter:HotBoolToVisibilityConverter x:Key="HotBoolToVisibilityConverter"/>
    </Window.Resources>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition  Width="auto"/>
            <ColumnDefinition Width="6*"/>
        </Grid.ColumnDefinitions>
        <ListBox Name="ProductsListBox" MaxWidth="290" HorizontalContentAlignment="Stretch">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <DataTemplate.Triggers>
                        <DataTrigger Binding="{Binding Path=IsHot}" Value="https://www.cnblogs.com/duwenlong/p/True">
                            <Setter Property="TextBlock.Foreground" TargetName="NameTextBlock" Value="https://www.cnblogs.com/duwenlong/p/Red"/>
                        </DataTrigger>
                    </DataTemplate.Triggers>
                        <Border Margin="5" CornerRadius="5" BorderThickness="1" BorderBrush="SteelBlue">
                            <Grid>
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="Auto"/>
                                    <RowDefinition Height="Auto"/>
                                    <RowDefinition/>
                                </Grid.RowDefinitions>
                            <Grid>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="Auto"/>
                                    <ColumnDefinition Width="*"/>
                                </Grid.ColumnDefinitions>
                                <TextBlock x:Name="NameTextBlock" Margin="3" FontWeight="Bold" Text="{Binding Path=Name}"/>
                                <TextBlock Margin="0,2,2,2" Visibility="{Binding IsHot,Converter={StaticResource HotBoolToVisibilityConverter}}" FontSize="10" Grid.Column="1" FontStyle="Italic" Text="Hot" Foreground="Red"/>
                            </Grid> 
                                <Grid Grid.Row="1">
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="Auto"/>
                                        <ColumnDefinition Width="*"/>
                                    </Grid.ColumnDefinitions>
                                    <Grid>
                                        <Grid.ColumnDefinitions>
                                            <ColumnDefinition Width="Auto"/>
                                            <ColumnDefinition Width="*"/>
                                        </Grid.ColumnDefinitions>
                                        <TextBlock  Text="單價:"/>
                                        <TextBlock Grid.Column="1" Text="{Binding Path=Price}"/> 
                                    </Grid>
                                    <Grid Margin="1,0" Grid.Column="1">
                                        <Grid.ColumnDefinitions>
                                            <ColumnDefinition Width="Auto"/>
                                            <ColumnDefinition Width="*"/>
                                        </Grid.ColumnDefinitions>
                                        <TextBlock Text="剩余數量:"/>
                                        <TextBlock Grid.Column="1" Text="{Binding Path=Number}"/>
                                    </Grid>
                                </Grid>  
                            </Grid> 
                        </Border>  
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
        <Border Margin="3" DataContext="{Binding ElementName=ProductsListBox,Path=SelectedItem}" Grid.Column="1" BorderBrush="AntiqueWhite" BorderThickness="1" CornerRadius="3">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto"></ColumnDefinition>
                    <ColumnDefinition></ColumnDefinition>
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"></RowDefinition>
                    <RowDefinition Height="Auto"></RowDefinition>
                    <RowDefinition Height="Auto"></RowDefinition>
                    <RowDefinition Height="Auto"></RowDefinition>
                    <RowDefinition Height="*"></RowDefinition>
                </Grid.RowDefinitions>
                <TextBlock  Text="名稱:"/>
                <TextBlock Grid.Column="1" Text="{Binding Name}"/>
                <TextBlock Grid.Row="1" Text="單價:"/>
                <TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding Price}"/>
                <TextBlock Grid.Row="2" Text="數量:"/>
                <TextBlock Grid.Row="2" Grid.Column="1" Text="{Binding Number}"/>
                <TextBlock Grid.Row="3" Text="介紹:"/>
                <TextBlock Grid.Row="3" Grid.Column="1" Text="{Binding Introduce}"/>
            </Grid> 
        </Border>
    </Grid>
</Window>

效果如下,這樣我們就實作了熱賣的功能,通過資料模板只修改了很少一部分內容,

我們去看上面的XAML代碼,我們現在只有一個簡單的ListBox重寫樣式,就這么多內容需要寫,那如果界面上內容特別多,代碼不是很難讀嗎,我們接下來把代碼拆出去,把DataTemplate寫到當前表單的Resources中,然后再ListBox中設定ItemTemplate等于我們再資源中定義的資料模板,代碼如下:

<Window x:
        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:converter="clr-namespace:HowtoUseDataTemplate.Converter"
        xmlns:local="clr-namespace:HowtoUseDataTemplate"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Window.Resources>
        <converter:HotBoolToVisibilityConverter x:Key="HotBoolToVisibilityConverter"/>
        <DataTemplate x:Key="ProductItemTemplate">
            <DataTemplate.Triggers>
                <DataTrigger Binding="{Binding Path=IsHot}" Value="https://www.cnblogs.com/duwenlong/p/True">
                    <Setter Property="TextBlock.Foreground" TargetName="NameTextBlock" Value="https://www.cnblogs.com/duwenlong/p/Red"/>
                </DataTrigger>
            </DataTemplate.Triggers>
            <Border Margin="5" CornerRadius="5" BorderThickness="1" BorderBrush="SteelBlue">
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto"/>
                        <RowDefinition Height="Auto"/>
                        <RowDefinition/>
                    </Grid.RowDefinitions>
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto"/>
                            <ColumnDefinition Width="*"/>
                        </Grid.ColumnDefinitions>
                        <TextBlock x:Name="NameTextBlock" Margin="3" FontWeight="Bold" Text="{Binding Path=Name}"/>
                        <TextBlock Margin="0,2,2,2" Visibility="{Binding IsHot,Converter={StaticResource HotBoolToVisibilityConverter}}" FontSize="10" Grid.Column="1" FontStyle="Italic" Text="Hot" Foreground="Red"/>
                    </Grid>
                    <Grid Grid.Row="1">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto"/>
                            <ColumnDefinition Width="*"/>
                        </Grid.ColumnDefinitions>
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="Auto"/>
                                <ColumnDefinition Width="*"/>
                            </Grid.ColumnDefinitions>
                            <TextBlock  Text="單價:"/>
                            <TextBlock Grid.Column="1" Text="{Binding Path=Price}"/>
                        </Grid>
                        <Grid Margin="1,0" Grid.Column="1">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="Auto"/>
                                <ColumnDefinition Width="*"/>
                            </Grid.ColumnDefinitions>
                            <TextBlock Text="剩余數量:"/>
                            <TextBlock Grid.Column="1" Text="{Binding Path=Number}"/>
                        </Grid>
                    </Grid>
                </Grid>
            </Border>
        </DataTemplate>
    </Window.Resources>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition  Width="auto"/>
            <ColumnDefinition Width="6*"/>
        </Grid.ColumnDefinitions>
        <ListBox Name="ProductsListBox" MaxWidth="290" HorizontalContentAlignment="Stretch" ItemTemplate="{StaticResource ProductItemTemplate}">
        </ListBox>
        <Border Margin="3" DataContext="{Binding ElementName=ProductsListBox,Path=SelectedItem}" Grid.Column="1" BorderBrush="AntiqueWhite" BorderThickness="1" CornerRadius="3">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto"></ColumnDefinition>
                    <ColumnDefinition></ColumnDefinition>
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"></RowDefinition>
                    <RowDefinition Height="Auto"></RowDefinition>
                    <RowDefinition Height="Auto"></RowDefinition>
                    <RowDefinition Height="Auto"></RowDefinition>
                    <RowDefinition Height="*"></RowDefinition>
                </Grid.RowDefinitions>
                <TextBlock  Text="名稱:"/>
                <TextBlock Grid.Column="1" Text="{Binding Name}"/>
                <TextBlock Grid.Row="1" Text="單價:"/>
                <TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding Price}"/>
                <TextBlock Grid.Row="2" Text="數量:"/>
                <TextBlock Grid.Row="2" Grid.Column="1" Text="{Binding Number}"/>
                <TextBlock Grid.Row="3" Text="介紹:"/>
                <TextBlock Grid.Row="3" Grid.Column="1" Text="{Binding Introduce}"/>
            </Grid> 
        </Border>
    </Grid>
</Window>

這樣Grid下的內容就少了很多,結構就清晰了一些,不建議把DataTemplate放到單獨的檔案夾中,因為如果App初始化的時候就加載了這些內容的話,可能targetType會影響到所有的使用了這個類的物件,但是其實也有x:key這個可以控制,所以這里具體看需要把,覺得怎么合適怎么來,反正主要的目標都是解耦,

再上面點擊更換Item的時候有個比較討厭的地方,選中的物件有一個藍色的底色改變了,這個是ItemContainerSytle的內容,修改ListBox代碼如下:

 <ListBox Name="ProductsListBox" MaxWidth="290" HorizontalContentAlignment="Stretch" ItemTemplate="{StaticResource ProductItemTemplate}">
            <ListBox.ItemContainerStyle>
                <Style>
                    <Setter Property="ItemsControl.Padding" Value="https://www.cnblogs.com/duwenlong/p/0"/>
                    <Style.Triggers>
                        <Trigger Property="ListBoxItem.IsSelected" Value="https://www.cnblogs.com/duwenlong/p/True">
                            <Setter Property="ListBoxItem.Background" Value="https://www.cnblogs.com/duwenlong/p/#84C1FF"/>
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </ListBox.ItemContainerStyle>
        </ListBox>

上面的資料模板中最外層的Border 外面嵌套一層Grid 同時背景色設定為和Listbox背景色一樣,就可以拉,

這篇就寫這么多,到這篇為止就打算基礎部分結束了,下篇講MVVM,IOC,就開始進入財務軟體的專案實戰,因為剩下一些沒講的章節,我整理了一下,大概是Page、Window、控制元件、TreeView、DataGrid等等,我覺得講控制元件不屬于入門知識,因為控制元件實際使用中包含了VM、資料模板、控制元件模板、Style還有更加深入的串列虛擬化、和資料虛擬化等等,還有怎么除錯并分析問題等等,所以這里就不打算講了,以后作為WPF技巧相關的文章,去梳理這些知識點,

我創建了一個C#相關的交流群,用于分享學習資料和討論問題,歡迎有興趣的小伙伴:QQ群:542633085

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/285420.html

標籤:WPF

上一篇:dotnet 讀 WPF 源代碼筆記 插入觸摸設備的初始化獲取設備資訊

下一篇:WPF自定義加載控制元件

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more