DataGridTemplateColumn类型可让你通过指定要显示和编辑值时使用的单元格模板创建你自己的列类型。 若要指定用于显示未处于编辑模式的单元格内容的模板,请设置CellTemplate属性。 若要指定用于显示编辑模式下的单元格内容的模板,请设置CellEditingTemplate属性。 有关模板的详细信息,请参阅数据模板化概述并样式和模板化。
private void Button_Click(object sender, RoutedEventArgs e)
{
Thread.CurrentThread.Name = "主线程";
Thread myThread =new Thread(new ThreadStart(fun));
myThread.Name = "子线程";
myThread.Start();
//Thread.Sleep(5000);
}
private void fun()
{
xButton.Dispatcher.BeginInvoke(new Action(()=>{ xButton.Background = System.Windows.Media.Brushes.Red; }));
xButton.Dispatcher.BeginInvoke(new Action(() => { xButton.Content = Thread.CurrentThread.Name; }));
MyButton.Dispatcher.BeginInvoke(new Action(() => { MyButton.Background = System.Windows.Media.Brushes.LightBlue; }));
MyButton.Dispatcher.BeginInvoke(new Action(()=> { MyButton.IsEnabled = false; }));
}
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace TaskWebApi
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
/// <summary>
/// 根据combox选择的城市进行API的地址进行选择
/// </summary>
public static string URL;
/// <summary>
/// 城市对应的API的地址
/// </summary>
public string GetCitys(string Name)
{
switch (Name)
{
case "北京": { return "http://www.weather.com.cn/data/sk/101010100.html"; }
case "天津": { return "http://www.weather.com.cn/data/sk/101030100.html"; }
case "武汉": { return "http://www.weather.com.cn/data/sk/101200101.html"; }
case "长沙": { return "http://www.weather.com.cn/data/sk/101250101.html"; }
case "上海": { return "http://www.weather.com.cn/data/sk/101020100.html"; }
default:
return "";
}
}
/// <summary>
/// Task进行访问
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private async void Btnsel_Click(object sender, RoutedEventArgs e)
{
string url = GetCitys((citys.SelectedValue as ComboBoxItem).Content.ToString());
if (url != null)
{
this.result.Text = await WeatherAsync(url);
}
else
{
MessageBox.Show("请选择要查询的城市");
}
}
/// <summary>
/// 根据传入的URL进行Task多线程进行访问
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
private async Task<string> WeatherAsync(string url) {
return await Task.Run(() =>
{
Weather model = new Weather();
string result = "";
try
{
HttpWebRequest req = WebRequest.Create(url) as HttpWebRequest;
req.ContentType = "multipart/form-data";
req.Accept = "*/*";
req.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)";
req.Timeout = 30000;
req.Method = "GET";
HttpWebResponse response = req.GetResponse() as HttpWebResponse;
using (StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
{
result = sr.ReadToEnd();
model = JsonConvert.DeserializeObject<Weather>(result);
}
}
catch (WebException ex)
{
model = null;
}
string newresult = JsonConvert.SerializeObject(model);
return newresult;
});
}
/// <summary>
/// Thread进行访问接口
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Butthread_Click(object sender, RoutedEventArgs e)
{
URL = GetCitys((citys.SelectedValue as ComboBoxItem).Content.ToString());
Thread myThread = new Thread(new ThreadStart(WeatherThread));
myThread.Start();
}
/// <summary>
/// 进行Thread访问
/// </summary>
private void WeatherThread()
{
result.Dispatcher.BeginInvoke(
new Action(() => {
Weather model = new Weather();
string result = "";
try
{
HttpWebRequest req = WebRequest.Create(URL) as HttpWebRequest;
req.ContentType = "multipart/form-data";
req.Accept = "*/*";
req.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)";
req.Timeout = 30000;
req.Method = "GET";
HttpWebResponse response = req.GetResponse() as HttpWebResponse;
using (StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
{
result = sr.ReadToEnd();
model = JsonConvert.DeserializeObject<Weather>(result);
}
}
catch (WebException ex)
{
model = null;
}
this.result.Text = JsonConvert.SerializeObject(model);
}));
}
}
}
下面的示例演示一个已命名Style供Button控件。 Style定义Trigger用于更改元素Foreground的按钮的属性时IsPressed属性是true
。
<Style x:Key="Triggers" TargetType="Button">
<Style.Triggers>
<Trigger Property="IsPressed" Value="true">
<Setter Property = "Foreground" Value="Green"/>
</Trigger>
</Style.Triggers>
</Style>
有几种方法中的样式WPF可以扩展或继承。 样式可以基于其他样式通过此属性。 当使用此属性时,新样式将继承原始样式不在新的样式中显式重新定义的值。 在以下示例中,Style2
继承Control.Background的值Yellow
,并添加Control.Foreground的值Blue
。
<Style x:Key="Style1">
<Setter Property="Control.Background" Value="Yellow"/>
</Style>
<Style x:Key="Style2" BasedOn="{StaticResource Style1}">
<Setter Property="Control.Foreground" Value="Blue"/>
</Style>
BasedOn | 获取或设置一个作为当前样式的基准的已定义样式。 |
Dispatcher | 获取与此 Dispatcher 关联的 DispatcherObject。 (Inherited from DispatcherObject) |
IsSealed | 获取一个值,该值指示样式是否为只读(无法更改)。 |
Resources | 获取或设置可在此样式的范围内使用的资源的集合。 |
Setters | 获取 Setter 和 EventSetter 对象的集合。 |
TargetType | 获取或设置此样式所针对的类型。 |
Triggers | 获取基于指定条件应用属性值的 TriggerBase 对象的集合。 |
https://www.cnblogs.com/yang-fei/p/4732505.html
<!--设置按钮的模板-->
<Setter Property="Template">
<!--设置按钮的模板-->
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Grid>
<Ellipse Fill="{TemplateBinding Background}"/>
<ContentPresenter
Margin="5"
HorizontalAlignment="Center"
VerticalAlignment="Center"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
---------------------
下面的示例包含两个MultiTriggers。 第一个集MinWidth属性值时HasItems属性为 false 并宽度属性是自动。第二个类似,但不适用于MinHeight属性。
<Style.Triggers>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Background" Value="#EEEEEE" />
</Trigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="HasItems" Value="false" />
<Condition Property="Width" Value="Auto" />
</MultiTrigger.Conditions>
<Setter Property="MinWidth" Value="120"/>
</MultiTrigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="HasItems" Value="false" />
<Condition Property="Height" Value="Auto" />
</MultiTrigger.Conditions>
<Setter Property="MinHeight" Value="95"/>
</MultiTrigger>
</Style.Triggers>
Conditions | 获取 Condition 对象的集合。 当满足集合中的所有条件时对属性值应用更改。 |
DependencyObjectType | 获取对此实例的 CLR 类型进行包装的 DependencyObjectType。 (Inherited from DependencyObject) |
Dispatcher | 获取与此 Dispatcher 关联的 DispatcherObject。 (Inherited from DispatcherObject) |
EnterActions | 获取要在触发器对象变为活动状态时应用的 TriggerAction 对象的集合。 此属性不适用于 EventTrigger 类。 (Inherited from TriggerBase) |
ExitActions | 获取要在触发器对象变为非活动状态时应用的 TriggerAction 对象的集合。 此属性不适用于 EventTrigger类。 (Inherited from TriggerBase) |
IsSealed | 获取一个值,该值指示此实例当前是否为密封的(只读)。 (Inherited from DependencyObject) |
Setters | 获取 Setter 对象的集合,这些对象描述当满足 MultiTrigger 的所有条件时要应用的属性值。 |
ControlTemplate 控件模板
<Style TargetType="Button">
<!--Set to true to not get any properties from the themes.-->
<Setter Property="OverridesDefaultStyle" Value="True"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Grid>
<Ellipse Fill="{TemplateBinding Background}"/>
<ContentPresenter HorizontalAlignment="Center"
VerticalAlignment="Center"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
DataTemplate 数据模板
<ListBox Width="400" Margin="10"
ItemsSource="{Binding Source={StaticResource myTodoList}}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Path=TaskName}" />
<TextBlock Text="{Binding Path=Description}"/>
<TextBlock Text="{Binding Path=Priority}"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
如下所示Button Style ,用于设置ControlTemplate的Button。 ControlTemplate定义的Button显示为Ellipse内Grid元素。ContentPresenter标记的Content的Button应显示并在垂直和水平居中Grid。
<Style TargetType="Button">
<!--Set to true to not get any properties from the themes.-->
<Setter Property="OverridesDefaultStyle" Value="True"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Grid>
<Ellipse Fill="{TemplateBinding Background}"/>
<ContentPresenter HorizontalAlignment="Center"
VerticalAlignment="Center"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
此示例演示如何使用事件触发器在样式中进行动画处理MouseEnter并MouseLeave的事件FrameworkElement。 在此示例中,Style已TargetType设置为Rectangle。 因此,没有必要来限定MouseEnter
和MouseLeave
事件名称与类的名称。
<Style TargetType="Rectangle">
<Setter Property="Width" Value="50" />
<Setter Property="Height" Value="50" />
<Setter Property="Margin" Value="20" />
<Setter Property="HorizontalAlignment" Value="Left" />
<Style.Triggers>
<EventTrigger RoutedEvent="MouseEnter">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation To="300" Duration="0:0:1.5"
AccelerationRatio="0.10" DecelerationRatio="0.25"
Storyboard.TargetProperty="(Canvas.Width)" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<EventTrigger RoutedEvent="MouseLeave">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Duration="0:0:1.5"
AccelerationRatio="0.10" DecelerationRatio="0.25"
Storyboard.TargetProperty="(Canvas.Width)" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Style.Triggers>
</Style>
<base:BaseUserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="../CN.xaml"/>
</ResourceDictionary.MergedDictionaries>
<converter:ColorConverter x:Key="ColConverter"></converter:ColorConverter>
</ResourceDictionary>
</base:BaseUserControl.Resources>