搜索
您的当前位置:首页正文

WPF实现定时刷新UI界面功能

2023-12-09 来源:车融汽车网

本文实例为大家分享了WPF定时刷新UI界面展示的具体代码,供大家参考,具体内容如下

代码:

using NHibernate.Criterion;using System;using System.Collections.Generic;using System.Collections.ObjectModel;using System.ComponentModel;using System.Data;using System.Linq;using System.Text;using System.Threading;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;using Visifire.Charts;namespace SunCreate.CombatPlatform.Client{ public partial class MainPage : UserControl { private System.Timers.Timer timerNotice = null; public MainPage() { InitializeComponent(); } private void MainPage_Loaded(object sender, RoutedEventArgs e) { #region 通知公告 if (timerNotice == null) { BindNotice(); timerNotice = new System.Timers.Timer(); timerNotice.Elapsed += new System.Timers.ElapsedEventHandler((o, eea) => { BindNotice(); }); timerNotice.Interval = 60 * 1000; timerNotice.Start(); } #endregion } private void MainPage_SizeChanged(object sender, SizeChangedEventArgs e) { } #region 绑定通知公告 private void BindNotice() { System.Threading.Tasks.Task.Factory.StartNew(() => { try { int total = 0; TES_NOTICE info = new TES_NOTICE(); IList<TES_NOTICE> list = new List<TES_NOTICE>(); list = HI.Get<INoticeService>().GetListPage(null, DateTime.MinValue, DateTime.MinValue, 1, 50, ref total); Dispatcher.Invoke(new Action(() => { noticeListView.ItemsSource = list; })); } catch { } }); } #endregion }}

说明:在 System.Timers.Timer 的事件中使用 BackgroundWorker 是无效的,即如下代码不能正常刷新界面:

using NHibernate.Criterion;using System;using System.Collections.Generic;using System.Collections.ObjectModel;using System.ComponentModel;using System.Data;using System.Linq;using System.Text;using System.Threading;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;using Visifire.Charts;namespace SunCreate.CombatPlatform.Client{ public partial class MainPage : UserControl { private System.Timers.Timer timerNotice = null; public MainPage() { InitializeComponent(); } private void MainPage_Loaded(object sender, RoutedEventArgs e) { #region 通知公告 if (timerNotice == null) { BindNotice(); timerNotice = new System.Timers.Timer(); timerNotice.Elapsed += new System.Timers.ElapsedEventHandler((o, eea) => { BindNotice(); }); timerNotice.Interval = 60 * 1000; timerNotice.Start(); } #endregion } private void MainPage_SizeChanged(object sender, SizeChangedEventArgs e) { } #region 绑定通知公告 private void BindNotice() { PT_USER_INFO user = new PT_USER_INFO(); IList<TES_COMBAT_TASK> taskList = new List<TES_COMBAT_TASK>(); BackgroundWorker worker = new BackgroundWorker(); worker.DoWork += (s, e) => { user = HI.Get<Cache.ICacheService>().UserCache.GetCurrentUserInfo(); taskList = HI.Get<ITaskService>().GetCombatTaskByUserIDUnfinished(user.ID.ToString()); }; worker.RunWorkerCompleted += (s, e) => { try { taskListView.ItemsSource = taskList; } catch { } }; worker.RunWorkerAsync(); } #endregion }}

也可以使用 DispatcherTimer 刷新界面,但耗时的操作不能放在DispatcherTimer的事件中执行,否则界面会卡,那么耗时的定时操作,比如查询数据库,需要再用一个 System.Timers.Timer,相对比较麻烦。

小编还为您整理了以下内容,可能对您也有帮助:

wpf怎么刷新界面或者控件呢?

用Dispather.Invoke(new Action(()=>{}));

WPF中的DataGrid 数据动态刷新UI

数据类继承:INotifyPropertyChanged, 实现INotifyPropertyChanged接口

public class CustomTableColumes: INotifyPropertyChanged

{

public event PropertyChangedEventHandler PropertyChanged;

public void NotiFy(string property)

{

    if (PropertyChanged != null)

    {

        PropertyChanged(this, new PropertyChangedEventArgs(property));

    }

}

    //实时刷新行里的某一列调用NotiFy

      public string Colume4

        {

            get

            {

                return _Colume4;

            }

            set

            {

                _Colume4 = value;

              NotiFy("Colume4");

            }

        }

public class PlcDebugViewModel : GenericViewModel<XmlItemNew>

{

private ObservableCollection<CustomTableColumes> customTable = new ObservableCollection<CustomTableColumes>();

      public ObservableCollection<CustomTableColumes> CustomTable

        {

            get

            {

                return customTable;

            }

            set

            {

                this.customTable = value;

                this.RaisePropertyChanged(() => this.CustomTable);

            }

        }

}

<DataGrid  Name="Mygrid" Grid.Row="2" Grid.Column="1" Grid.RowSpan="24" Margin="5"  SelectedCellsChanged="DataRowSelected"  ItemsSource="{Binding CustomTable}" >

                            <DataGrid.Columns>

                                <DataGridTextColumn Width="130*"  Header="名称"  Binding="{Binding Colume0}"  IsReadOnly="True"/>

                                <DataGridTextColumn Width="60*"  Header="读写属性"  Binding="{Binding Colume1}"  IsReadOnly="True"/>

                                <DataGridTextColumn Width="90*"  Header="数值范围"  Binding="{Binding Colume2}"  IsReadOnly="True"/>

                                <DataGridTextColumn Width="100*"  Header="内控参数"  Binding="{Binding Colume3}"  IsReadOnly="True"/>

                                <DataGridTextColumn Width="100*"  Header="当前内容"  Binding="{Binding Colume4}"  IsReadOnly="True"/>

                                <DataGridTextColumn Width="195*"  Header="备注说明"  Binding="{Binding Colume5}"  IsReadOnly="True"/>

                                <DataGridTextColumn Width="30*"  Header=""  Visibility="Hidden"  Binding="{Binding Colume6}"  IsReadOnly="True"/>

                                <DataGridTextColumn Width="30*"  Header=""  Visibility="Hidden"  Binding="{Binding Colume7}"  IsReadOnly="True"/>

                            </DataGrid.Columns>

                        </DataGrid>

看到另一种方法

WPF中的DataGrid 数据动态刷新UI

数据类继承:INotifyPropertyChanged, 实现INotifyPropertyChanged接口

public class CustomTableColumes: INotifyPropertyChanged

{

public event PropertyChangedEventHandler PropertyChanged;

public void NotiFy(string property)

{

    if (PropertyChanged != null)

    {

        PropertyChanged(this, new PropertyChangedEventArgs(property));

    }

}

    //实时刷新行里的某一列调用NotiFy

      public string Colume4

        {

            get

            {

                return _Colume4;

            }

            set

            {

                _Colume4 = value;

              NotiFy("Colume4");

            }

        }

public class PlcDebugViewModel : GenericViewModel<XmlItemNew>

{

private ObservableCollection<CustomTableColumes> customTable = new ObservableCollection<CustomTableColumes>();

      public ObservableCollection<CustomTableColumes> CustomTable

        {

            get

            {

                return customTable;

            }

            set

            {

                this.customTable = value;

                this.RaisePropertyChanged(() => this.CustomTable);

            }

        }

}

<DataGrid  Name="Mygrid" Grid.Row="2" Grid.Column="1" Grid.RowSpan="24" Margin="5"  SelectedCellsChanged="DataRowSelected"  ItemsSource="{Binding CustomTable}" >

                            <DataGrid.Columns>

                                <DataGridTextColumn Width="130*"  Header="名称"  Binding="{Binding Colume0}"  IsReadOnly="True"/>

                                <DataGridTextColumn Width="60*"  Header="读写属性"  Binding="{Binding Colume1}"  IsReadOnly="True"/>

                                <DataGridTextColumn Width="90*"  Header="数值范围"  Binding="{Binding Colume2}"  IsReadOnly="True"/>

                                <DataGridTextColumn Width="100*"  Header="内控参数"  Binding="{Binding Colume3}"  IsReadOnly="True"/>

                                <DataGridTextColumn Width="100*"  Header="当前内容"  Binding="{Binding Colume4}"  IsReadOnly="True"/>

                                <DataGridTextColumn Width="195*"  Header="备注说明"  Binding="{Binding Colume5}"  IsReadOnly="True"/>

                                <DataGridTextColumn Width="30*"  Header=""  Visibility="Hidden"  Binding="{Binding Colume6}"  IsReadOnly="True"/>

                                <DataGridTextColumn Width="30*"  Header=""  Visibility="Hidden"  Binding="{Binding Colume7}"  IsReadOnly="True"/>

                            </DataGrid.Columns>

                        </DataGrid>

看到另一种方法

WPF中ListBox控件刷新问题

WPF采用了与原来WinForm完全不同的刷新机制。在WPF中,只能通过Dispatcher.BeginInvoke方法来刷新UI元素

实现你要求的代码如下:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading;

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 WpfUIAsyncUpdate

{

    /// <summary>

    /// MainWindow.xaml 的交互逻辑

    /// </summary>

    public partial class MainWindow : Window

    {

        public MainWindow()

        {

            InitializeComponent();

        }

        private void button_Click(object sender, RoutedEventArgs e)

        {

            box.Items.Add("String A");

            

            //启动一个线程

            Thread t = new Thread(LongWork);

            t.IsBackground = true;

            t.Start();

        }

        private void LongWork()

        {

            Thread.Sleep(8000); //模拟一个耗时的操作

            

            //向ListBox添加一个项 "String B"

            //由于LongWork运行在后台线程上

            //所以必须通过box.Dispatcher.BeginInvoke来刷新界面

            //这与WinForm中跨线程刷新控件有些类似

            box.Dispatcher.BeginInvoke(

                new Action(() => { box.Items.Add("String B"); }), 

                null);

        }

    }

}

elementui页面每分钟刷新一次

热门频道

首页

博客

研修院

VIP

APP

问答

下载

社区

推荐频道

活动

招聘

专题

打开CSDN APP
Copyright © 1999-2020, CSDN.NET, All Rights Reserved

elementui刷新页面
打开APP

elementUI-解决刷新页面路由地址和页面不跟随变化的问题 原创
2022-08-17 17:37:17
2点赞

super码力

码龄1年

关注
在页面未刷新之前,每个导航都可以点击跳转到对应的页面并且跳转路径一致,但是一旦刷新,当前高亮的导航选项和页面以及跳转路径就不一样了。

问题展示:

🌹第一种解决方式

打开elementUI官网可以看到有一个select事件,如下图:

首先可以在代码中绑定一个事件函数,在函数方法中传入index参数,并且使用localStorage存储index,接着在生命周期函数created中把index赋值

代码如下:

<template>
<div>
<!-- 导航 -->
<el-menu
:default-active="activeIndex"
class="el-menu-demo"
mode="horizontal"
background-color="#545c64"
text-color="#fff"
active-text-color="#ffd04b"
router
@select="selectMenu"
>
<el-menu-item index="/">首页 </el-menu-item>
<el-menu-item index="/about">关于 </el-menu-item>
<el-menu-item index="/personal">个人中心 </el-menu-item>
</el-menu>
<!-- 出口 -->
<router-view></router-view>
</div>
</template>

<script>
export default {
name: "DianshangLayout",

data() {
return {
activeIndex: "/",
};
},

methods: {
//1、定义函数,绑定到@select
selectMenu(index, path) {
console.log(index, path);
//存储index的值
localStorage.setItem("index", index);
},
},

created() {
//生命周期获取index并赋值
let index = localStorage.getItem("index");
if (index) {
this.activeIndex = index;
}
},
};
</script>
解决之后效果如下:

🌹第二种解决方式

直接在el-menu给default-active绑定$route.path就可以快速实现 :default-active="$route.path"

代码如下:

<template>
<div>
<!-- 导航 -->
<el-menu
:default-active="$route.path"
class="el-menu-demo"
mode="horizontal"
background-color="#545c64"
text-color="#fff"
active-text-color="#ffd04b"
router
>
<el-menu-item index="/">首页 </el-menu-item>
<el-menu-item index="/about">关于 </el-menu-item>
<el-menu-item index="/personal">个人中心 </el-menu-item>
</el-menu>
<!-- 出口 -->
<router-view></router-view>
</div>
</template>
关注展开
打开CSDN,阅读体验更佳

VUE + element-ui刷新当前页面_小仙女de成长的博客
需要使用的页面中调用如下export default { inject:['reload'], data() { } }this.reload()直接调用即可 小仙女de成长 关注 0 5 0 专栏目录 vue-element-admin局部刷新页面 a125129167的博客 5993 在写业务需求的时候遇到...
Element UI 中el-input 框回车触发页面刷新问题及解决方案——基础积...
今天做了一个小小的功能,就是基于elementUi框架的一个输入框,需要监听输入框的回车事件,然后调取接口。 代码如下: <el-form:model="ruleForm"label-width="100px"><el-form-item label="物料编码"><el-input v-model="ruleForm...
使用element-ui的el-menu刷新保持选中状态
使用element-ui的el-menu刷新保持选中状态
继续访问
elementui el-tab页面切换如何自动刷新当前页面?
问题描述: 当tab页面第一次切换时会自动刷新页面,但当第二次再切换到该页面是不自动刷新,如何让每次切换都刷新问题。 解决方法: 去掉keep-alive。子组件修改监听事件。 keep-alive:主要用于保留组件状态或避免重新渲染。 父组件原代码(无法实现切换自动刷新): <el-tabs v-model="activeName" @tab-click="handleClick" type="border-card"> <el-tab-pane
继续访问
element实现当前页面/表格刷新方法_来干了这碗代码的博客_elem...
VUE + element-ui实现当前页面/表格刷新方法 之前在做elementui的项目,一些新增,编辑,删除等操作后,需要刷新当前页面或者表格,看官方文档没找到合适的方法,之前是直接重新再调一遍后台接口进行数据的刷新,今天发现一个不错的方法,来记录一...
vue2.0+ElementUI 实现tabs切换刷新页面_柘月十七的博客_elem...
vue2.0+ElementUI 实现tabs切换刷新页面 前端博客不写页面效果都是耍流氓!在下面这样的一个简单页面,需要实现从用户列表跳转到黑名单页面,然后再跳回用户列表,要实现对用户列表刷新这样一个需求。总的来说,就是两个页面相互切换要实现...
【elementui+vue】使用导航时设置:default-active=“$route.path“无效的问题
【elementui+vue】使用导航时设置:default-active="$route.path"无效的问题
继续访问
Vue-Elementui 实现局部网页刷新
Vue-Elementui 实现局部网页刷新 方法一:使用2.2.0 新增的provide / inject控制的显示隐藏 在App.vue中使用provide //App.vue <template> <div> <router-view v-if="isRouterAlive"></router-view> <...
继续访问
elementUI 输入框回车刷新页面__let的博客_elementui...
elementUI 输入框回车刷新页面 如何出现? 当el-form 表单内只有一个 el-input 输入框时,在输入框内回车就会触发表单的提交事件。 <el-form :model="formData"> <el-form-item label="服务名称" :rules="[ { required: true, ...
vue+element动态设置el-menu导航,刷新页面保持当前菜单选中项及路由
两种方式 <el-menu :default-active="$route.path"></el-menu> 2.(1)、设置属性 :default-active=“activeIndex” (2)、watch方法检测路由变化 (3)、created生命周期设置路由 <template> <div style="position: relative"> <el-menu router mode="horiz
继续访问

vue+elementui 如何刷新整个界面
在这里当我们上传图片再对图片进行回显的时候,当前这个vue文件还是可以得到这个图片的地址从而进行回显的,而当我们一个界面是由两个vue构成的呢?那么另一个vue该怎么进行重新加载呢? 第一种方法:对整个界面进行刷新。 ...
继续访问
Vue+ElementUI实现点击按钮刷新页面
js部分代码:刷新页面主要用到this.$router.go(0)或window.location.reload()vue中ElementUI刷新页面代码。
继续访问
vue+element ui新增和修改之后刷新页面
一.在App.vue中 <template> <div id="app"> <router-view v-if="isRouterAlive"/> </div> </template> <script> export default { provide(){ return{ reload:this.reload, } }, data(){ return{
继续访问
element 导航菜单,嵌套路由初始化时,页面导航菜单选中,但是页面内容不变的解决办法。
问题描述: <template> <div class="detail-middle"> <el-menu router default-active="/pointDetail/:id/firePointMap" class="el-menu- demo" mode="horizontal">
继续访问
vue刷新页面如何保证路由不变_vue 刷新之后 嵌套路由不变 重新渲染页面的方法...
vue 刷新之后 嵌套路由不变 重新渲染页面的方法解决嵌套路由刷新时,路由没有变化,正常情况下页面是不会重新渲染的1、在router-view中加上条件渲染 v-if 默认为true。让它显示出来2、写写一个reload方法,在页面刷新只有,点击某个查询条件的时候调用这个重载的方法这是条件渲染变化了为false在修改数据之后使用 $nextTick,条件渲染变化了为true则可以在回调中获取更新后...
继续访问
最新发布 Vue-elementui-admin 快捷标签导航栏解决切换路由不刷新问题
首先找到 @/layout/components/AppMain.vue 然后移除 keep-alive。如上,问题解决了,按文档来说,直接使用keep-alive也是有弊端的,但是问题不大,好歹解决问题了。
继续访问

使用element-ui表单,点击回车查询时,页面重新刷新加载的问题
使用element-ui表单,点击回车查询时,页面重新刷新加载的问题 代码: <el-form :model="queryParams" ref="queryForm" label-width="68px"> <el-form-item label="展示名称" prop="showName"> <el-input v-model="queryParams.showName"
继续访问
Vue中路由刷新后设置默认跳转页面(redirect)重定向
Vue中路由刷新后设置默认跳转页面(redirect)重定项
继续访问

vue使用element-ui,页面刷新,导航栏跳转问题(解决)
产生的原因 原因是在使用组件时,设置了默认选中,因此页面刷新,导航发生了变化,而路由及页面并未改变 :default-active="activeIndex" data() { return { activeIndex: '1', }; }, 解决办法 第一步,同样还是要使用默认选中 :default-active="leftNavActive"...
继续访问
热门推荐 VUE + element-ui实现当前页面/表格刷新方法
之前在做elementui的项目,一些新增,编辑,删除等操作后,需要刷新当前页面或者表格,看官方文档没找到合适的方法,之前是直接重新再调一遍后台接口进行数据的刷新,今天发现一个不错的方法,来记录一下 App.vue中配置入下 <template> <div id="app"> <router-view v-if="isRouterAlive">&l...
继续访问
vue+element 路由跳转方式和常见问题
@[TOC]记录开发中常见的问题 跳转路由的几种方式 1、声明式: 1) 根据路由路径(/home/sort/detail)跳转 <router-link :to="{path: '/home/sort/detail', query:{id: 'abc'}}">点击查看子页面</router-link> 2) 根据路由名称(detail)跳转 <router-link :to="{name: 'detail', params:{id: 'abc'}}">点击查
继续访问
elementUI嵌套路由的导航栏在刷新页面的时候选中状态消失的解决
嵌套路由在router.js里面设置meta路由元信息解决方法 { path: '/home', component: Home, redirect: '/sys', children: [ { path: '/sys', component: Sys ,meta:'/sys'}, { path: '/app', component: App, redirect:'/
继续访问
element-ui form 表单按回车后整个页面刷新
element-ui form 表单按回车后整个页面刷新 <el-form :model="form" ref="ruleFormRef" size="default" label-width="70px"> <el-row :gutter="20"> <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="4" class="mb20"> <el-form-item label=
继续访问
ElementUI NavMenu导航菜单,跳转到包含子路由的路由时,导航菜单项不高亮显示
ElementUI NavMenu导航菜单,跳转到包含子路由的路由时,导航菜单项不高亮显示
继续访问

ElementUI导航栏根据路由改变状态
最近在用Vue开发前端时遇到了一个问题,就是ElementUI控件库中的ElMenu控件(用于导航)无法随着路由(请求地址)的变化而改变高亮的条目。查阅官方文档得知ElMenu有一个default-active属性。该属性代表ElMenu被创建后,处于高亮状态的条目的索引值。于是我便将default-active属性与route的path属性绑定在了一起。实现代码如下: <el-menu :default-active="$route.path" :router="true"> <
继续访问
elementui刷新页面
前端
写评论

评论

收藏

2



分享
打开CSDN APP阅读体验更佳×

elementui页面每分钟刷新一次

热门频道

首页

博客

研修院

VIP

APP

问答

下载

社区

推荐频道

活动

招聘

专题

打开CSDN APP
Copyright © 1999-2020, CSDN.NET, All Rights Reserved

elementui刷新页面
打开APP

elementUI-解决刷新页面路由地址和页面不跟随变化的问题 原创
2022-08-17 17:37:17
2点赞

super码力

码龄1年

关注
在页面未刷新之前,每个导航都可以点击跳转到对应的页面并且跳转路径一致,但是一旦刷新,当前高亮的导航选项和页面以及跳转路径就不一样了。

问题展示:

🌹第一种解决方式

打开elementUI官网可以看到有一个select事件,如下图:

首先可以在代码中绑定一个事件函数,在函数方法中传入index参数,并且使用localStorage存储index,接着在生命周期函数created中把index赋值

代码如下:

<template>
<div>
<!-- 导航 -->
<el-menu
:default-active="activeIndex"
class="el-menu-demo"
mode="horizontal"
background-color="#545c64"
text-color="#fff"
active-text-color="#ffd04b"
router
@select="selectMenu"
>
<el-menu-item index="/">首页 </el-menu-item>
<el-menu-item index="/about">关于 </el-menu-item>
<el-menu-item index="/personal">个人中心 </el-menu-item>
</el-menu>
<!-- 出口 -->
<router-view></router-view>
</div>
</template>

<script>
export default {
name: "DianshangLayout",

data() {
return {
activeIndex: "/",
};
},

methods: {
//1、定义函数,绑定到@select
selectMenu(index, path) {
console.log(index, path);
//存储index的值
localStorage.setItem("index", index);
},
},

created() {
//生命周期获取index并赋值
let index = localStorage.getItem("index");
if (index) {
this.activeIndex = index;
}
},
};
</script>
解决之后效果如下:

🌹第二种解决方式

直接在el-menu给default-active绑定$route.path就可以快速实现 :default-active="$route.path"

代码如下:

<template>
<div>
<!-- 导航 -->
<el-menu
:default-active="$route.path"
class="el-menu-demo"
mode="horizontal"
background-color="#545c64"
text-color="#fff"
active-text-color="#ffd04b"
router
>
<el-menu-item index="/">首页 </el-menu-item>
<el-menu-item index="/about">关于 </el-menu-item>
<el-menu-item index="/personal">个人中心 </el-menu-item>
</el-menu>
<!-- 出口 -->
<router-view></router-view>
</div>
</template>
关注展开
打开CSDN,阅读体验更佳

VUE + element-ui刷新当前页面_小仙女de成长的博客
需要使用的页面中调用如下export default { inject:['reload'], data() { } }this.reload()直接调用即可 小仙女de成长 关注 0 5 0 专栏目录 vue-element-admin局部刷新页面 a125129167的博客 5993 在写业务需求的时候遇到...
Element UI 中el-input 框回车触发页面刷新问题及解决方案——基础积...
今天做了一个小小的功能,就是基于elementUi框架的一个输入框,需要监听输入框的回车事件,然后调取接口。 代码如下: <el-form:model="ruleForm"label-width="100px"><el-form-item label="物料编码"><el-input v-model="ruleForm...
使用element-ui的el-menu刷新保持选中状态
使用element-ui的el-menu刷新保持选中状态
继续访问
elementui el-tab页面切换如何自动刷新当前页面?
问题描述: 当tab页面第一次切换时会自动刷新页面,但当第二次再切换到该页面是不自动刷新,如何让每次切换都刷新问题。 解决方法: 去掉keep-alive。子组件修改监听事件。 keep-alive:主要用于保留组件状态或避免重新渲染。 父组件原代码(无法实现切换自动刷新): <el-tabs v-model="activeName" @tab-click="handleClick" type="border-card"> <el-tab-pane
继续访问
element实现当前页面/表格刷新方法_来干了这碗代码的博客_elem...
VUE + element-ui实现当前页面/表格刷新方法 之前在做elementui的项目,一些新增,编辑,删除等操作后,需要刷新当前页面或者表格,看官方文档没找到合适的方法,之前是直接重新再调一遍后台接口进行数据的刷新,今天发现一个不错的方法,来记录一...
vue2.0+ElementUI 实现tabs切换刷新页面_柘月十七的博客_elem...
vue2.0+ElementUI 实现tabs切换刷新页面 前端博客不写页面效果都是耍流氓!在下面这样的一个简单页面,需要实现从用户列表跳转到黑名单页面,然后再跳回用户列表,要实现对用户列表刷新这样一个需求。总的来说,就是两个页面相互切换要实现...
【elementui+vue】使用导航时设置:default-active=“$route.path“无效的问题
【elementui+vue】使用导航时设置:default-active="$route.path"无效的问题
继续访问
Vue-Elementui 实现局部网页刷新
Vue-Elementui 实现局部网页刷新 方法一:使用2.2.0 新增的provide / inject控制的显示隐藏 在App.vue中使用provide //App.vue <template> <div> <router-view v-if="isRouterAlive"></router-view> <...
继续访问
elementUI 输入框回车刷新页面__let的博客_elementui...
elementUI 输入框回车刷新页面 如何出现? 当el-form 表单内只有一个 el-input 输入框时,在输入框内回车就会触发表单的提交事件。 <el-form :model="formData"> <el-form-item label="服务名称" :rules="[ { required: true, ...
vue+element动态设置el-menu导航,刷新页面保持当前菜单选中项及路由
两种方式 <el-menu :default-active="$route.path"></el-menu> 2.(1)、设置属性 :default-active=“activeIndex” (2)、watch方法检测路由变化 (3)、created生命周期设置路由 <template> <div style="position: relative"> <el-menu router mode="horiz
继续访问

vue+elementui 如何刷新整个界面
在这里当我们上传图片再对图片进行回显的时候,当前这个vue文件还是可以得到这个图片的地址从而进行回显的,而当我们一个界面是由两个vue构成的呢?那么另一个vue该怎么进行重新加载呢? 第一种方法:对整个界面进行刷新。 ...
继续访问
Vue+ElementUI实现点击按钮刷新页面
js部分代码:刷新页面主要用到this.$router.go(0)或window.location.reload()vue中ElementUI刷新页面代码。
继续访问
vue+element ui新增和修改之后刷新页面
一.在App.vue中 <template> <div id="app"> <router-view v-if="isRouterAlive"/> </div> </template> <script> export default { provide(){ return{ reload:this.reload, } }, data(){ return{
继续访问
element 导航菜单,嵌套路由初始化时,页面导航菜单选中,但是页面内容不变的解决办法。
问题描述: <template> <div class="detail-middle"> <el-menu router default-active="/pointDetail/:id/firePointMap" class="el-menu- demo" mode="horizontal">
继续访问
vue刷新页面如何保证路由不变_vue 刷新之后 嵌套路由不变 重新渲染页面的方法...
vue 刷新之后 嵌套路由不变 重新渲染页面的方法解决嵌套路由刷新时,路由没有变化,正常情况下页面是不会重新渲染的1、在router-view中加上条件渲染 v-if 默认为true。让它显示出来2、写写一个reload方法,在页面刷新只有,点击某个查询条件的时候调用这个重载的方法这是条件渲染变化了为false在修改数据之后使用 $nextTick,条件渲染变化了为true则可以在回调中获取更新后...
继续访问
最新发布 Vue-elementui-admin 快捷标签导航栏解决切换路由不刷新问题
首先找到 @/layout/components/AppMain.vue 然后移除 keep-alive。如上,问题解决了,按文档来说,直接使用keep-alive也是有弊端的,但是问题不大,好歹解决问题了。
继续访问

使用element-ui表单,点击回车查询时,页面重新刷新加载的问题
使用element-ui表单,点击回车查询时,页面重新刷新加载的问题 代码: <el-form :model="queryParams" ref="queryForm" label-width="68px"> <el-form-item label="展示名称" prop="showName"> <el-input v-model="queryParams.showName"
继续访问
Vue中路由刷新后设置默认跳转页面(redirect)重定向
Vue中路由刷新后设置默认跳转页面(redirect)重定项
继续访问

vue使用element-ui,页面刷新,导航栏跳转问题(解决)
产生的原因 原因是在使用组件时,设置了默认选中,因此页面刷新,导航发生了变化,而路由及页面并未改变 :default-active="activeIndex" data() { return { activeIndex: '1', }; }, 解决办法 第一步,同样还是要使用默认选中 :default-active="leftNavActive"...
继续访问
热门推荐 VUE + element-ui实现当前页面/表格刷新方法
之前在做elementui的项目,一些新增,编辑,删除等操作后,需要刷新当前页面或者表格,看官方文档没找到合适的方法,之前是直接重新再调一遍后台接口进行数据的刷新,今天发现一个不错的方法,来记录一下 App.vue中配置入下 <template> <div id="app"> <router-view v-if="isRouterAlive">&l...
继续访问
vue+element 路由跳转方式和常见问题
@[TOC]记录开发中常见的问题 跳转路由的几种方式 1、声明式: 1) 根据路由路径(/home/sort/detail)跳转 <router-link :to="{path: '/home/sort/detail', query:{id: 'abc'}}">点击查看子页面</router-link> 2) 根据路由名称(detail)跳转 <router-link :to="{name: 'detail', params:{id: 'abc'}}">点击查
继续访问
elementUI嵌套路由的导航栏在刷新页面的时候选中状态消失的解决
嵌套路由在router.js里面设置meta路由元信息解决方法 { path: '/home', component: Home, redirect: '/sys', children: [ { path: '/sys', component: Sys ,meta:'/sys'}, { path: '/app', component: App, redirect:'/
继续访问
element-ui form 表单按回车后整个页面刷新
element-ui form 表单按回车后整个页面刷新 <el-form :model="form" ref="ruleFormRef" size="default" label-width="70px"> <el-row :gutter="20"> <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="4" class="mb20"> <el-form-item label=
继续访问
ElementUI NavMenu导航菜单,跳转到包含子路由的路由时,导航菜单项不高亮显示
ElementUI NavMenu导航菜单,跳转到包含子路由的路由时,导航菜单项不高亮显示
继续访问

ElementUI导航栏根据路由改变状态
最近在用Vue开发前端时遇到了一个问题,就是ElementUI控件库中的ElMenu控件(用于导航)无法随着路由(请求地址)的变化而改变高亮的条目。查阅官方文档得知ElMenu有一个default-active属性。该属性代表ElMenu被创建后,处于高亮状态的条目的索引值。于是我便将default-active属性与route的path属性绑定在了一起。实现代码如下: <el-menu :default-active="$route.path" :router="true"> <
继续访问
elementui刷新页面
前端
写评论

评论

收藏

2



分享
打开CSDN APP阅读体验更佳×

wpf ShowDialog或者其他操作后 UI不动 最小化再次最大化后又恢复正常

不会自动刷新,因为你操作过或者是最小化后都是会刷新的。

要设置刷新间隔比如15s自动刷新一次。(根据自己配置高低设置,配置高点的间隔就可以设置短一点)

打字不容易,感觉ok就给个好评采纳吧,谢谢。。。。。追问是我用了ShowDialog返回以后,页面就是假死状态了 点哪都不动 不能正常交互,但是实际上是点到了 但是ui就是不变,最小化 再还原后 界面就正常了

追答不了解,帮不了你。

wpf 多语言对应 切换了 dll后 如何刷新窗体(window)

百度搜索 "C# 国际化 动态切换"

我主要讲几种比较通用的实现方式:

使用XAML动态绑定的方法

百度搜索  "WPF实现无刷新动态切换多语言(国际化)"  这篇文章中讲的,语言使用xaml文件,不使用自带的Resources。通过DynamicResource 动态绑定。在后台代码通过修改ResourceDictionary.MergedDictionaries来动态切换语言。

2.重新加载窗体的方法

百度搜索 “C#中 动态切换当前界面的语言”这篇文章中讲的,清除页面所有控件,然后修改当前进程语言,然后调用InitializeComponent();方法重新初始化页面。不过这篇文章讲的是Winform,理论上我认为WPF也可以用,题主可以一试。

这个问题我之前也遇到过,我采用的是方法1,我一直认为C#默认的语言文件编译成单独的dll并且每种语言的dll占用一个文件夹的方式很不好,目录结构显的很乱。

我理想的方式是有一个专门的L18n或者locales文件夹放每种语言的语言包,目前大部分软件也都是这样搞。

最好是语言包是我们可以直接编辑或者解压之后可编辑的,这样修改添加语言文件就不需要重新编译软件了。

wpf 多语言对应 切换了 dll后 如何刷新窗体(window)

百度搜索 "C# 国际化 动态切换"

我主要讲几种比较通用的实现方式:

使用XAML动态绑定的方法

百度搜索  "WPF实现无刷新动态切换多语言(国际化)"  这篇文章中讲的,语言使用xaml文件,不使用自带的Resources。通过DynamicResource 动态绑定。在后台代码通过修改ResourceDictionary.MergedDictionaries来动态切换语言。

2.重新加载窗体的方法

百度搜索 “C#中 动态切换当前界面的语言”这篇文章中讲的,清除页面所有控件,然后修改当前进程语言,然后调用InitializeComponent();方法重新初始化页面。不过这篇文章讲的是Winform,理论上我认为WPF也可以用,题主可以一试。

这个问题我之前也遇到过,我采用的是方法1,我一直认为C#默认的语言文件编译成单独的dll并且每种语言的dll占用一个文件夹的方式很不好,目录结构显的很乱。

我理想的方式是有一个专门的L18n或者locales文件夹放每种语言的语言包,目前大部分软件也都是这样搞。

最好是语言包是我们可以直接编辑或者解压之后可编辑的,这样修改添加语言文件就不需要重新编译软件了。

在MFC中使用WPF技术

一 介绍

本文将以一个实例来说明如何将WPF技术集成在基于MFC的应用程序中 这种技术的主要目的是为了增强基于Win /MFC的应用程序的在图形方面的表现能力 本文所提供的演示程序将在MFC对话框架应用程序中显示一个WPF动画时钟 界面如图 所示

本文需要的开发工具和开发库    为了建立和运行demo程序 我们需要安装如下的组件

Visual Studio 或Visual Studio     NET Framework 或 NET Framework

所需要的平台    demo程序必须在下面支持 NET Framework 的操作系统平台上运行

Windows Vista   Windows XP SP    Windows Server SP

如果你是一名C++开发人员 并且想使用WPF技术来增强自己的基于Win /MFC应用程序 本文非常适合你 为了能从本文学习到更多的知识 我们需要熟悉VC++/CLi MFC XAML和C# 但是 如果我们不了解C#或XAML 我们仍然可以通过引用现成的DLL来使用WPF程序   

二 什么是WPF

WPF是Windows Presentation Foundation的缩写 它是微软 NET Framework 的一个子系统 这种技术允许开发人员高效地创建可视化的应用程序 并改善用户体验 由于WPF的发布 使用Windows程序在富控件的设计 开发上更如虎添翼 WPF主要关注一套应用程序服务 用户接口 D和 D 矢量图 动画 数据绑字 音频 并提供一个在UI和商业逻辑之间的非常清晰的界限

WPF API是被管制的代码 但是大多数Win /MFC程序是非管制的C++代码 按著惯例 WPF API不能通过非常制程序调用 然后 通过使用VC编译器的/clr选项 我们可以建立一个由管制和非管制混合而面的系统 在这个系统中 我们可以使管制和非管制代码无缝地混合在一起

有一个要注意的是在C++工程中不允许编译XAML文件 因此 我们必须建立一个包含在本例中所需要的所有XAML而的C# DLL 然后在C++工程中包含这个Dll引用

有两种基本的技术可以融合WPF和Win /MFC代码

将WPF放到Win /MFC程序中 使用这种技术 开发人员可以使用WPF的高级图形能力来渲染Win /MFC应用程序

       将Win /MFC放到WPF中 使用这种技术 开发人员可以在WPF中使用已经存在的

Win /MFC控件 并通过一定的机制来传递数据

在本文中将采用第一种方法  

三      融合Win /MFC和WPF程序

上面部分所说的是本例的基本规则 下面在本节中将介绍如何编写具体的实现代码 在本例中 我首先会演示使用XAML和C#建立WPF内容 并在VC++中引用这个DLL

本例的目的是建立一个用于设置日期和时间的设置工具 其中动画部分使用WPF实现 程序的其他部分仍然使用MFC实现

这个演示程序由两部分组成 一个是MFCHostMPF(由VC++/MFC代码组成) 另一个是WPFControls(由XAML和C#代码组成) 这个MFCHostWPF工程将由WPFControls工程所产生的DLL作为一个外部的引用 如图 所示

向MFC工程中加入一个WPF引用 如图 和图 所示

        三 在MFC应用程序中加入和WPF相关的代码

先提一下 gcnew关键字被用于建立一个管制类型的实例 在本例中将建立一个垃圾回收集合栈的实例 所有被gcnew分配的内存空间将被垃圾回收器自动管理 而开发人员并不需要为什么时间释放它们而操心

为了使用WPF程序 关键是System::Windows::Interop::HwndSource类 这个类将在Win 窗口中使用WPF程序 因此 WPF程序可以作为MFC窗口的子窗口放到UI上 而在WPF对象和Win 窗口之间的通讯要通过引用C++程序中被存储的静态字段 这些静态字段的代码如下

ref class Globals { public: static System::Windows::Interop::HwndSource^ gHwndSource; static WPFControls::AnimClock^ gwcClock; };

         HWND hwndWPF;    // 和WPF相关的hwnd    为了建立一个HwndSource 首先需要建立一个HwndSourceParameters结构 这个结构需要如下的参数     类 窗口 窗口类型    窗口的初始位置    窗口的初始尺寸    父窗口    一但我们将HwndSourceParameters结构编写完 就可以将这个结构到HwndSource的构造方法HwndSource(HwndSourceParameters)中     最后 我们将WPF时钟的引用赋值给HwndSource对象的RootVisual属性 并通过调用Handle ToPointer()返回HwndSource的HWND 代码如下

HWND GetHwnd(HWND parent int x int y int width int height) { System::Windows::Interop::HwndSourceParameters^ sourceParams = gcnew System::Windows::Interop::HwndSourceParameters ( MFCWPFApp ); sourceParams >PositionX = x; sourceParams >PositionY = y; sourceParams >Height = height; sourceParams >Width = width; sourceParams >ParentWindow = IntPtr(parent); sourceParams >WindowStyle = WS_VISIBLE | WS_CHILD; Globals::gHwndSource = gcnew System::Windows::Interop::HwndSource(*sourceParams); DateTime tm = DateTime::Now; Globals::gwcClock = gcnew WPFControls::AnimClock(); Globals::gwcClock >ChangeDateTime(tm Year tm Month tm Day tm Hour tm Minute tm Second); FrameworkElement^ myPage = Globals::gwcClock; Globals::gHwndSource >RootVisual = myPage; return (HWND) Globals::gHwndSource >Handle ToPointer(); }

        因此 无论用户如何变化时钟 我们的MFC代码都会调用RefereshWPFControl()来刷新WPF时钟

void RefreshWPFControl() { FrameworkElement^ page; DateTime tm = DateTime::Now; Globals::gwcClock >ChangeDateTime(tm Year tm Month tm Day tm Hour tm Minute tm Second); page = Globals::gwcClock; Globals::gHwndSource >RootVisual = page; return; }

        现在我们已经有了大部分我们需要的功能了 而最后的任务是在MFC对话框代码中找个地方调用HwndSource实现创建函数 当然 有很多地方可以做这个工作 但是OnCreate也许是最好的位置 在OnCreate事件句柄中调用GetHwnd()函数的代码如下

int CMFCHostWPFDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CDialog::OnCreate(lpCreateStruct) == ) return ; hwndWPF = GetHwnd(this >GetSafeHwnd() ); return ; }

        四 结论lishixin/Article/program/net/201311/11996

    在MFC中使用WPF技术

    一 介绍

    本文将以一个实例来说明如何将WPF技术集成在基于MFC的应用程序中 这种技术的主要目的是为了增强基于Win /MFC的应用程序的在图形方面的表现能力 本文所提供的演示程序将在MFC对话框架应用程序中显示一个WPF动画时钟 界面如图 所示

    本文需要的开发工具和开发库    为了建立和运行demo程序 我们需要安装如下的组件

    Visual Studio 或Visual Studio     NET Framework 或 NET Framework

    所需要的平台    demo程序必须在下面支持 NET Framework 的操作系统平台上运行

    Windows Vista   Windows XP SP    Windows Server SP

    如果你是一名C++开发人员 并且想使用WPF技术来增强自己的基于Win /MFC应用程序 本文非常适合你 为了能从本文学习到更多的知识 我们需要熟悉VC++/CLi MFC XAML和C# 但是 如果我们不了解C#或XAML 我们仍然可以通过引用现成的DLL来使用WPF程序   

    二 什么是WPF

    WPF是Windows Presentation Foundation的缩写 它是微软 NET Framework 的一个子系统 这种技术允许开发人员高效地创建可视化的应用程序 并改善用户体验 由于WPF的发布 使用Windows程序在富控件的设计 开发上更如虎添翼 WPF主要关注一套应用程序服务 用户接口 D和 D 矢量图 动画 数据绑字 音频 并提供一个在UI和商业逻辑之间的非常清晰的界限

    WPF API是被管制的代码 但是大多数Win /MFC程序是非管制的C++代码 按著惯例 WPF API不能通过非常制程序调用 然后 通过使用VC编译器的/clr选项 我们可以建立一个由管制和非管制混合而面的系统 在这个系统中 我们可以使管制和非管制代码无缝地混合在一起

    有一个要注意的是在C++工程中不允许编译XAML文件 因此 我们必须建立一个包含在本例中所需要的所有XAML而的C# DLL 然后在C++工程中包含这个Dll引用

    有两种基本的技术可以融合WPF和Win /MFC代码

    将WPF放到Win /MFC程序中 使用这种技术 开发人员可以使用WPF的高级图形能力来渲染Win /MFC应用程序

           将Win /MFC放到WPF中 使用这种技术 开发人员可以在WPF中使用已经存在的

    Win /MFC控件 并通过一定的机制来传递数据

    在本文中将采用第一种方法  

    三      融合Win /MFC和WPF程序

    上面部分所说的是本例的基本规则 下面在本节中将介绍如何编写具体的实现代码 在本例中 我首先会演示使用XAML和C#建立WPF内容 并在VC++中引用这个DLL

    本例的目的是建立一个用于设置日期和时间的设置工具 其中动画部分使用WPF实现 程序的其他部分仍然使用MFC实现

    这个演示程序由两部分组成 一个是MFCHostMPF(由VC++/MFC代码组成) 另一个是WPFControls(由XAML和C#代码组成) 这个MFCHostWPF工程将由WPFControls工程所产生的DLL作为一个外部的引用 如图 所示

    向MFC工程中加入一个WPF引用 如图 和图 所示

            三 在MFC应用程序中加入和WPF相关的代码

    先提一下 gcnew关键字被用于建立一个管制类型的实例 在本例中将建立一个垃圾回收集合栈的实例 所有被gcnew分配的内存空间将被垃圾回收器自动管理 而开发人员并不需要为什么时间释放它们而操心

    为了使用WPF程序 关键是System::Windows::Interop::HwndSource类 这个类将在Win 窗口中使用WPF程序 因此 WPF程序可以作为MFC窗口的子窗口放到UI上 而在WPF对象和Win 窗口之间的通讯要通过引用C++程序中被存储的静态字段 这些静态字段的代码如下

    ref class Globals { public: static System::Windows::Interop::HwndSource^ gHwndSource; static WPFControls::AnimClock^ gwcClock; };

             HWND hwndWPF;    // 和WPF相关的hwnd    为了建立一个HwndSource 首先需要建立一个HwndSourceParameters结构 这个结构需要如下的参数     类 窗口 窗口类型    窗口的初始位置    窗口的初始尺寸    父窗口    一但我们将HwndSourceParameters结构编写完 就可以将这个结构到HwndSource的构造方法HwndSource(HwndSourceParameters)中     最后 我们将WPF时钟的引用赋值给HwndSource对象的RootVisual属性 并通过调用Handle ToPointer()返回HwndSource的HWND 代码如下

    HWND GetHwnd(HWND parent int x int y int width int height) { System::Windows::Interop::HwndSourceParameters^ sourceParams = gcnew System::Windows::Interop::HwndSourceParameters ( MFCWPFApp ); sourceParams >PositionX = x; sourceParams >PositionY = y; sourceParams >Height = height; sourceParams >Width = width; sourceParams >ParentWindow = IntPtr(parent); sourceParams >WindowStyle = WS_VISIBLE | WS_CHILD; Globals::gHwndSource = gcnew System::Windows::Interop::HwndSource(*sourceParams); DateTime tm = DateTime::Now; Globals::gwcClock = gcnew WPFControls::AnimClock(); Globals::gwcClock >ChangeDateTime(tm Year tm Month tm Day tm Hour tm Minute tm Second); FrameworkElement^ myPage = Globals::gwcClock; Globals::gHwndSource >RootVisual = myPage; return (HWND) Globals::gHwndSource >Handle ToPointer(); }

            因此 无论用户如何变化时钟 我们的MFC代码都会调用RefereshWPFControl()来刷新WPF时钟

    void RefreshWPFControl() { FrameworkElement^ page; DateTime tm = DateTime::Now; Globals::gwcClock >ChangeDateTime(tm Year tm Month tm Day tm Hour tm Minute tm Second); page = Globals::gwcClock; Globals::gHwndSource >RootVisual = page; return; }

            现在我们已经有了大部分我们需要的功能了 而最后的任务是在MFC对话框代码中找个地方调用HwndSource实现创建函数 当然 有很多地方可以做这个工作 但是OnCreate也许是最好的位置 在OnCreate事件句柄中调用GetHwnd()函数的代码如下

    int CMFCHostWPFDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CDialog::OnCreate(lpCreateStruct) == ) return ; hwndWPF = GetHwnd(this >GetSafeHwnd() ); return ; }

            四 结论lishixin/Article/program/net/201311/11996

      如何定时刷新Android界面

      Android程序中可以使用的界面刷新方法有两种,分别是利用Handler和利用postInvalidate()来实现在线程中刷新界面。

      利用Handler刷新界面

      实例化一个Handler对象,并重写handleMessage方法调用invalidate()实现界面刷新;而在线程中通过sendMessage发送界面更新消息。

      复制到剪贴板 java代码// 在onCreate()中开启线程 new Thread(new GameThread()).start();、 // 实例化一个handler Handler myHandler = new Handler() { //接收到消息后处理 public void handleMessage(Message msg) { switch (msg.what) { case Activity01.REFRESH: mGameView.invalidate(); //刷新界面 break; } super.handleMessage(msg); } }; class GameThread implements Runnable { public void run() { while (!Thread.currentThread().isInterrupted()) { Message message = new Message(); message.what = Activity01.REFRESH; //发送消息 Activity01.this.myHandler.sendMessage(message); try { Thread.sleep(100); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } } } 使用postInvalidate()刷新界面

      使用postInvalidate则比较简单,不需要handler,直接在线程中调用postInvalidate即可。

      复制到剪贴板 Java代码class GameThread implements Runnable { public void run() { while (!Thread.currentThread().isInterrupted()) { try { Thread.sleep(100); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } //使用postInvalidate可以直接在线程中更新界 mGameView.postInvalidate(); } } }

      WPF的图形呈现

        本主题概述 WPF 可视化层 本主题重点讲述 WPF 模型中呈现支持的 Visual 类的角色

        Visual 对象的角色 Visual 类是每个 FrameworkElement 对象所派生自的基本抽象 该类还充当在 WPF 中编写新控件的入口点 在 Win 应用程序模型中 该类在许多方面可以被视为窗口句柄 (HWND)

        Visual 对象是一个核心 WPF 对象 它的主要角色是提供呈现支持 用户界面控件(如 Button 和 TextBox)派生自 Visual 类 并使用该类来保持它们所呈现的数据 Visual 对象为下列功能提供支持

        输出显示 呈现 Visual 对象的持久的序列化绘图内容

        转换 针对 Visual 对象执行转换

        剪辑 为 Visual 对象提供剪辑区域支持

        命中测试 确定 Visual 对象的边界内是否包含坐标或几何形状

        边界框计算 确定 Visual 对象的边框

        但是 Visual 对象不包括对非呈现功能的支持 如 ◆事件处理

        ◆布局

        ◆样式

        ◆数据绑定

        ◆全球化

        Visual 作为子类必须派生自的公共抽象类进行公开 下图显示了 WPF 中所公开的可视化对象的层次结构

        Visual 类的层次结构

         

        DrawingVisual 类DrawingVisual 是一个用于呈现形状 图像或文本的轻量绘图类 此类之所以被视为轻量 是因为它不提供布局或事件处理功能 从而能够改善运行时性能 因此 绘图最适于背景和剪贴画 DrawingVisual 可用于创建自定义可视化对象

        Viewport DVisual 类Viewport DVisual 在二维 Visual 和 Visual D 对象之间起到桥梁作用 Visual D 类是所有三维可视化元素的基类 Viewport DVisual 要求您定义一个 Camera 值和一个 Viewport 值 可以借助照相机来查看场景 投影映射到二维图面的区域称作视区

        ContainerVisual 类ContainerVisual 类用作 Visual 对象集的容器 DrawingVisual 类派生自 ContainerVisual 类 这允许它包含可视化对象的集合

        可视化对象中的绘图内容Visual 对象将它的呈现数据另存为向量图形指令列表 指令列表中的每一项都以序列化格式表示一组低级别的图形数据及其相关资源 共有四种不同类型的呈现数据可以包含绘图内容

         

        通过 DrawingContext 您可用可视化内容填充 Visual 当您使用 DrawingContext 对象的绘图命令时 实际上是存储一组日后将由图形系统使用的呈现数据 而不是实时绘制到屏幕上

        当您创建 WPF 控件(如 Button)时 该控件会为绘图对象本身隐式生成呈现数据 例如 设置 Button 的 Content 属性会导致该控件存储标志符号的呈现表示

        Visual 将其内容描述为一个或多个包含在 DrawingGroup 中的 Drawing 对象 DrawingGroup 还描述不透明蒙板 转换 位图效果和应用于其内容的其他操作 呈现内容时 DrawingGroup 操作按如下顺序应用 OpacityMask Opacity BitmapEffect ClipGeometry GuidelineSet 和 Transform

        下图显示了在呈现过程中 DrawingGroup 操作的应用顺序

         

        DrawingGroup 操作的顺序

        在可视化层绘制内容绝不能直接实例化 DrawingContext 但可以通过某些方法

        (例如 DrawingGroup :: Open 和 DrawingVisual :: RenderOpen)获取绘图上下文 下面的示例从 DrawingVisual 中检索 DrawingContext 并将其用于绘制矩形

         

        在可视化层枚举绘图内容此外 Drawing 对象还可提供用来枚举 Visual 内容的对象模型

        说明 您在枚举可视化层的内容时 就是相当于在检索 Drawing 对象 而不是以向量图形指令列表形式检索呈现数据的基础表示 下面的示例使用 GetDrawing 方法来检索 Visual 的 DrawingGroup 值并枚举该值

         

        如何使用可视化对象来生成控件 WPF 中的许多对象都由其他可视化对象组成 这意味着它们可以包含子代对象的各种层次结构 WPF 中的许多用户界面元素(如控件)都由多个表示不同类型呈现元素的可视化对象组成 例如 Button 控件可以包含许多其他对象 其中包括 ClassicBorderDecorator ContentPresenter 和 TextBlock

        下面的代码显示的是在标记中定义的 Button 控件

         

        如果您要枚举包含默认 Button 控件的可视化对象 则将发现如下所示的可视化对象层次结构

        可视化树层次结构的关系图

         

        Button 控件包含一个 ClassicBorderDecorator 元素 该元素又包含一个 ContentPresenter 元素 ClassicBorderDecorator 元素负责为 Button 绘制边框和背景 ContentPresenter 元素负责显示 Button 的内容 在本例中 由于您要显示文本 因此 ContentPresenter 元素中包含一个 TextBlock 元素 Button 控件使用 ContentPresenter 这意味着该控件的内容可以由其他元素(如 Image)或几何形状(如 EllipseGeometry)来表示

        控件模板将控件扩展为控件层次结构的关键在于 ControlTemplate 控件模板为控件指定默认的可视化层次结构 当您显式引用某个控件时 会隐式引用它的可视化层次结构 您可以重写控件模板的默认值 以便为控件创建自定义的可视化外观 例如 您可以修改 Button 控件的背景颜色值 以便它使用线性渐变颜色值 而不使用纯色值

        用户界面元素(如 Button 控件)包含几个向量图形指令列表 这些列表描述控件的全部呈现定义 下面的代码显示的是在标记中定义的 Button 控件

         

        如果您要枚举包含 Button 控件的可视化对象和向量图形指令列表

        则将发现如下所示的可视化对象层次结构

        可视化树和呈现数据的关系图

         

        Button 控件包含一个 ClassicBorderDecorator 元素 该元素又包含一个 ContentPresenter 元素 ClassicBorderDecorator 元素负责绘制所有构成按钮边框和背景的离散图形元素 ContentPresenter 元素负责显示 Button 的内容 在本例中 由于您要显示图像 因此 ContentPresenter 元素中包含一个 Image 元素

        对于可视化对象和向量图形指令列表的层次结构 需要注意多个事项

        该层次结构中的排序表示绘图信息的呈现顺序 从可视化元素的根 按照从左到右 从上到下的顺序遍历子元素 如果某个元素有可视化子元素 则会先遍历该元素的子元素 然后再遍历该元素的同级

        层次结构中的非叶节点元素(如 ContentPresenter)用于包含子元素 它们并不包含指令列表

        如果可视化元素既包含向量图形指令列表又包含可视化子级 则会先呈现父级可视化元素中的指令列表 然后再呈现任何可视化子对象中的绘图

        向量图形指令列表中的项按照从左到右的顺序呈现

        可视化树 可视化树中包含某个应用程序的用户界面所使用的所有可视化元素 由于可视化元素中包含持久的绘图信息 因此您可以将可视化树视为场景图 其中包含将输出写入显示设备所必需的全部呈现信息 该树汇集了由该应用程序在代码或标记中直接创建的所有可视化元素 该可视化树还包含由元素(如控件和数据对象)的模板扩展功能创建的所有可视化元素

        

        下面的代码显示的是在标记中定义的 StackPanel 元素

        如果您要枚举包含标记示例中 StackPanel 元素的可视化对象 将发现如下所示可视化对象的层次结构

        可视化树层次结构的关系图

          呈现顺序通过可视化树 可以确定 WPF 可视化对象和绘图对象的呈现顺序 将从位于可视化树中最顶层节点中的可视化元素根开始遍历 然后将按照从左到右的顺序遍历可视化元素根的子级 如果某个可视化元素有子级 则将先遍历该可视化元素的子级 然后再遍历其同级 这意味着子可视化元素的内容先于该可视化元素本身的内容而呈现

        可视化树呈现顺序的关系图

          可视化元素根可视化元素根是可视化树层次结构中最顶层的元素 在大多数应用程序中 可视化元素根的基类是 Window 或 NavigationWindow 但是 如果您在 Win 应用程序中承载可视化对象 则可视化元素根将是在 Win 窗口中承载的最顶层的可视化元素

        与逻辑树的关系WPF 中的逻辑树表示应用程序在运行时的元素 尽管您不直接操作该树 但是该应用程序视图对于了解属性继承和事件路由非常有用 与可视化树不同 逻辑树可以表示非可视化数据对象(如 ListItem) 在许多情况下 逻辑树密切映射到应用程序的标记定义 下面的代码显示的是在标记中定义的 DockPanel 元素

         

        如果您要枚举包含标记示例中 DockPanel 元素的逻辑对象 则将发现如下所示逻辑对象的层次结构

        逻辑树的关系图

         

        可视化树和逻辑树与当前的应用程序元素集合同步 并反映对元素进行的任何添加 删除或修改 但是 这些树表示不同的应用程序视图 与可视化树不同 逻辑树不展开控件的 ContentPresenter 元素 这意味着同一组对象的逻辑树和可视化树之间没有直接的一对一对应关系 实际上 在将同一个元素用作参数的情况下 调用 LogicalTreeHelper 对象的 GetChildren 方法与调用 VisualTreeHelper 对象的 GetChild 方法会生成不同的结果

        使用 XamlPad 查看可视化树WPF 工具 (XamlPad) 提供了一个用来查看和浏览可视化树的选项 该树与当前所定义的 XAML 内容相对应 单击菜单栏上的 显示可视化树 [Show Visual Tree]按钮可显示相应的可视化树

        下面将说明如何在 XamlPad 的 可视化树资源管理器 [Visual Tree Explorer]面板中将 XAML 内容扩展为可视化树节点

        XamlPad 中的 可视化树资源管理器 [Visual Tree Explorer]面板

         

        请注意 Label TextBox 和 Button 控件在 XamlPad 的 可视化树资源管理器 [Visual Tree Explorer]面板中各自显示一个可视化对象层次结构 这是由于 WPF 控件具有一个包含其可视化树的 ControlTemplate 当您显式引用某个控件时 会隐式引用它的可视化层次结构

        分析可视化性能WPF 提供了一套性能分析工具 来帮助您分析应用程序的运行时行为 并确定可以应用的性能优化的类型 可视化探查器工具通过直接映射到应用程序的可视化树来为性能数据提供一个丰富的图形视图 在此屏幕快照中 可视化探查器的 CPU Usage [CPU 使用率]部分使您可以清楚地了解对象对 WPF 服务(如呈现和布局)的使用情况

        可视化探查器显示输出

         

        可视化对象的呈现行为 WPF 引进了几个影响可视化对象呈现行为的功能 保留的模式图形 矢量图形和与设备无关的图形

        保留的模式图形了解即时模式和保留模式图形系统之间的区别是了解 Visual 对象角色的要点之一 基于 GDI 或 GDI+ 的标准 Win 应用程序使用即时模式图形系统 这意味着应用程序负责重新绘制工作区中由于某项操作(如调整窗口大小)或者对象的可视化外观发生变化而失效的部分

        Win 呈现顺序的关系图

         与之相比 WPF 使用保留模式系统 这意味着具有可视化外观的应用程序对象定义一组序列化绘图数据 在定义了绘图数据之后 系统会响应所有的重新绘制请求来呈现应用程序对象 甚至在运行时 您也可以修改或创建应用程序对象 并仍旧依赖系统响应绘制请求 保留模式图形系统中有一个强大功能 那就是绘图信息总是由应用程序保持为序列化状态 但是呈现功能仍由系统负责 下面的关系图演示应用程序如何依赖 WPF 来响应绘制请求

        WPF 呈现顺序的关系图

         智能重绘使用保留模型图形的最大好处之一就是 WPF 可以高效率地优化需要在应用程序中重绘的内容 即使您有一个具有各种不透明度的复杂场景 通常也不必编写特殊用途的代码来优化重绘功能 请将智能重绘功能与 Win 编程进行比较 在后者中 可以通过最小化更新区域中的重绘量来尽力优化应用程序

        向量图形WPF 使用向量图形作为其呈现数据的格式 向量图形(包括可缩放的向量图形 (SVG) Windows 元文件 ( wmf) 和 TrueType 字体)存储呈现数据 并以指令列表的形式传输该呈现数据 这些指令描述如何使用图形基元来重新创建图像 例如 TrueType 字体是描述一组直线 曲线和命令(而不是像素数组)的矢量字 矢量图形的主要好处之一就是能够伸缩到任何大小和分辨率

        与矢量图形不同 位图图形以图像的逐像素表示形式来存储呈现数据 而且在特定的分辨率下预先呈现 位图图形格式和矢量图形格式的主要区别之一就是对原始图像的保真度 例如 当某个源图像的大小发生变化时 位图图形系统会拉伸该图像 而向量图形系统会伸缩该图像 从而保持图像的保真度

        下图显示了源图像在放大到 倍时的情况 请注意 当源图像作为位图图形拉伸时会发生失真 而当源图像作为矢量图形伸缩时 则不会发生失真

        光栅图形和矢量图形之间的区别

         下面的标记显示所定义的两个 Path 元素 第二个元素使用 ScaleTransform 将第一个元素的绘图指令放大到 倍 请注意 Path 元素中的绘图指令保持不变

         

        关于分辨率和与设备无关的图形可通过以下两个系统因子来确定屏幕上的文本大小和图形大小 分辨率和 DPI 分辨率描述出现在屏幕上的像素数量 由于分辨率变大 因此像素会变小 从而导致所显示的图形和文本会变小 在将显示器的分辨率从 x 更改为 x 时 显示器上所显示的图形会小得多

        另一个系统设置 (DPI) 以像素数来描述屏幕英寸的大小 大多数 Windows 系统的 DPI 都为 这意味着一屏幕英寸等于 个像素 增加 DPI 设置会使屏幕英寸变大 减小 DPI 会使屏幕英寸变小 这意味着屏幕英寸与实际的英寸不相等 在多数系统上 二者很有可能不相等 当您增加 DPI 时 屏幕英寸会变大 因此支持 DPI 的图形和文本也会变大 增加 DPI 可能会增强文本的可读性 在高分辨率下尤其如此

        并非所有的应用程序都支持 DPI 一些应用程序将硬件像素作为其主要计量单位 更改系统 DPI 不会对这些应用程序产生任何影响 许多其他应用程序都使用支持 DPI 的单位来描述字号 使用像素来描述任何其他内容 DPI 太小或太大都可能会导致这些应用程序出现布局问题 因为应用程序的文本会随着系统的 DPI 设置而伸缩 而应用程序的 UI 却不会出现此类问题 对于使用 WPF 开发的应用程序 此问题已经消除

        WPF 支持通过将与设备无关的像素(而不是硬件像素)用作其主要计量单位来自动伸缩 图像和文本会适当伸缩 而无需应用程序开发人员执行任何额外的工作 下图显示了 WPF 文本和图形在不同 DPI 设置下的显示方式的示例

        不同 DPI 设置下的图形和文本

         VisualTreeHelper 类 VisualTreeHelper 类是一个静态帮助器类 它提供了一个要在可视化对象级别编程的低级功能 该类在非常特殊的方案(如开发高性能自定义控件)中非常有用

        在大多数情况下 更高级的 WPF 框架对象(如 Canvas 和 TextBlock)提供更大的灵活性且更易于使用

        命中测试VisualTreeHelper 类提供了当默认的命中测试支持无法满足您的需要时 针对可视化对象的命中测试方法 可以在 VisualTreeHelper 类中使用 HitTest 方法来确定几何形状或点坐标值是否位于给定对象(如控件或图形元素)的边界内 例如 您可以使用命中测试来确定鼠标在对象边框中的单击点是否落在圆形几何形状内部 您还可以选择重写对命中测试的默认实现来执行自己的自定义命中测试计算

        枚举可视化树VisualTreeHelper 类提供了用来枚举可视化树成员的功能 若要检索父级 请调用 GetParent 方法 若要检索可视化对象的子级或直接子代 请调用 GetChild 方法 此方法返回父级在指定索引处的子 Visual

        下面的示例演示如何枚举一个可视化对象的所有子代 如果您对序列化可视化对象层次结构的所有呈现信息感兴趣 则可能希望使用该技术

         

        在大多数情况下 逻辑树更能表示 WPF 应用程序中的元素 尽管您不直接修改逻辑树 但是该应用程序视图对于了解属性继承和事件路由非常有用 与可视化树不同 逻辑树可以表示非可视化数据对象(如 ListItem) VisualTreeHelper 类提供用来返回可视化对象边框的方法 可以通过调用 GetContentBounds 来返回可视化对象的边框 可以通过调用 GetDescendantBounds 来返回可视化对象及其所有子代的边框 下面的代码演示如何计算可视化对象及其所有子代的边框

      lishixin/Article/program/net/201311/11370

      车融汽车网还为您提供以下相关内容希望对您有帮助:

      WPF中的DataGrid 数据动态刷新UI

      数据类继承:INotifyPropertyChanged, 实现INotifyPropertyChanged接口 public class CustomTableColumes: INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged;public void NotiFy(string property){  ...

      WPF中ListBox控件刷新问题

      WPF采用了与原来WinForm完全不同的刷新机制。在WPF中,只能通过Dispatcher.BeginInvoke方法来刷新UI元素 实现你要求的代码如下:using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Th...

      WPF的问题 一个内容控件,打开界面的时候,我想先让界面显示出来,再加 ...

      创建一个定时器,1秒或者一定时间后开始加载数据。需要读取数据的时候界面还不卡,考虑使用BackgroundWorker,在BackgroundWorker里直接用Wait Delay之类的也可以,不会导致UI失去响应。

      wpf ShowDialog或者其他操作后 UI不动 最小化再次最大化后又恢复正常...

      不会自动刷新,因为你操作过或者是最小化后都是会刷新的。要设置刷新间隔比如15s自动刷新一次。(根据自己配置高低设置,配置高点的间隔就可以设置短一点)打字不容易,感觉ok就给个好评采纳吧,谢谢。。。

      wpf 多语言对应 切换了 dll后 如何刷新窗体(window)

      我主要讲几种比较通用的实现方式:使用XAML动态绑定的方法 百度搜索 "WPF实现无刷新动态切换多语言(国际化)" 这篇文章中讲的,语言使用xaml文件,不使用自带的Resources。通过DynamicResource 动态绑定。在后台代码通过修改...

      如何定时刷新Android界面

      利用Handler刷新界面 实例化一个Handler对象,并重写handleMessage方法调用invalidate()实现界面刷新;而在线程中通过sendMessage发送界面更新消息。复制到剪贴板 java代码// 在onCreate()中开启线程 new Thread(new GameThread())...

      在MFC中使用WPF技术

      为了使用WPF程序 关键是System::Windows::Interop::HwndSource类 这个类将在Win 窗口中使用WPF程序 因此 WPF程序可以作为MFC窗口的子窗口放到UI上 而在WPF对象和Win 窗口之间的通讯要通过引用C++程序中被存储的静态字段 这些...

      C# DateGirdView插入数据之后怎么实现实时更新数据?

      你在建立好 数据---UI 绑定之后,如果后台数据发生变化,需要手动去通知前端进行更新,也就是重新绑定一次。如果是WPF的DataGrid,由于引入了(INotifyPropertyChanged )通知类集合的特性,可以在初始化的时候建立绑定, 后面...

      什么是WPF

      WPF使用一种新的XAML(eXtensible Application Markup Language)语言来开发界面,这将把界面开发以及后台逻辑很好的分开,降低了耦合度,使用户界面设计师与程序开发者能更好的合作,降低维护和更新的成本。 WPF/E 是WPF的子集...

      elementui页面每分钟刷新一次

      第一种方法:对整个界面进行刷新。 ...继续访问Vue+ElementUI实现点击按钮刷新页面js部分代码:刷新页面主要用到this.$router.go(0)或window.location.reload()vue中ElementUI刷新页面代码。继续访问vue+element ui新增和修改之后刷新页面一...

      本文如未解决您的问题请添加抖音号:51dongshi(抖音搜索懂视),直接咨询即可。

      热门图文

      Top