0524 子线程修改主线程的UI 控件模板 数据模板

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);
                }));
        }
    }
}
下面的示例演示一个已命名StyleButton控件。 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 ,用于设置ControlTemplateButton。 ControlTemplate定义的Button显示为EllipseGrid元素。ContentPresenter标记的ContentButton应显示并在垂直和水平居中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>

此示例演示如何使用事件触发器在样式中进行动画处理MouseEnterMouseLeave的事件FrameworkElement。 在此示例中,StyleTargetType设置为Rectangle。 因此,没有必要来限定MouseEnterMouseLeave事件名称与类的名称。

<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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值