XAML控件不可访问,它具有一定的保护级别
其它namespace的代码访问控件时会出现这个问题
需要把控件状态由protected改为public
<TextBlock x:FieldModifier="public" x:Name="AccessibleTextBlock" />
The x:Name attribute in XAML creates named fields that you can use to access the controls from the code-behind. However, as opposed to WPF, in UWP these fields are private which means you can access them from the code-behind only, not from other classes. While noting it is a good idea from architectural standpoint, is it possible to change this behavior?
Normal behavior
Let’s define a simple TextBlock
control in XAML.
1
|
<TextBlock x:Name="InaccessibleTextBlock" />
|
Now, what happens if we create a new class that takes the page as parameter of one of the methods and tries to access the TextBlock
?
1
2
3
4
5
6
7
|
public static class OutsideAccess
{
public static void ChangeTexts(MainPage page)
{
page.InaccessibleTextBlock.Text = "Accessed"; //does not work!
}
}
|
The app will not compile, because the field is inaccessible due to its protection level.
To see what actually happens behind the scenes, let’s open the auto-generated MainPage.g.i.cs file which can be found in the obj folder. We can find the following field there:
1
2
|
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Windows.UI.Xaml.Build.Tasks"," 14.0.0.0")]
private global::Windows.UI.Xaml.Controls.TextBlock InaccessibleTextBlock;
|
Clearly, the field is defined as private.
x:FieldModifier directive
To change the code generation behavior, you can use the x:FieldModifier
directive. This allows you to specify excatly which access modifier should be field have.
1
|
<TextBlock x:FieldModifier="public" x:Name="AccessibleTextBlock" />
|
Now, accessing the field from the outside works as a charm:
1
2
3
4
5
6
7
|
public static class OutsideAccess
{
public static void ChangeTexts(MainPage page)
{
page.AccessibleTextBlock.Text = "Accessed";
}
}
|
Note that you are not limited to public
and private
only, and you can also set the field to be internal
or protected
.
We can confirm the change of visiblity was reflected in the generated source code:
1
2
|
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Windows.UI.Xaml.Build.Tasks"," 14.0.0.0")]
public global::Windows.UI.Xaml.Controls.TextBlock AccessibleTextBlock;
|
WPF
If you wonder, what is the default behavior in WPF, wonder no more!
WPF’s convention is to set all named fields as internal
by default:
1
2
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock InaccessibleTextBlock;
|
You can use the x:FieldModifier
directive to modify the visibility the same way as in UWP.
XAML控件不可访问,它具有一定的保护级别的更多相关文章
- C#中线程对控件的访问
Control类提供了一个Invoke方法来给子线程访问主线程的控件,它的原型是酱紫的: object.Control.Invoke(Delegate method); object.Control. ...
- WPF后台设置xaml控件的样式System.Windows.Style
WPF后台设置xaml控件的样式System.Windows.Style 摘-自 :感谢 作者: IT小兵 http://3w.suchso.com/projecteac-tual/wpf-zhi ...
- 浅谈XAML控件
在win10系统内简单使用了XAML控件,由于本人英语水平有限,在自己的摸索使用.分析代码以及翻译软件.搜索引擎.室友情的帮助下了解了控件的相关功能,下面简要对XAML控件提出几点建议: 1.Cale ...
- WPF不同线程之间的控件的访问
原文:WPF不同线程之间的控件的访问 WPF不同线程之间的控件是不同访问的,为了能够访问其他线程之间的控件,需要用Dispatcher.Invoke执行一个新的活动即可. 例如: public voi ...
- Xamarin.Forms XAML控件的公共属性
Xamarin.Forms XAML控件的公共属性 Xamarin.Forms XAML控件有很多.通过官网API,可以查看每个控件的属性.但是官网只给出了控件的特有属性,而公共属性没有列出.所以 ...
- WPF--动态添加控件、访问控件
//WPF窗口采用默认的Grid布局控件,其“Name”值为“grid1”,在“grid1”中添加三个Button按钮.动态添加控件并访问这些控件的代码如下: private void button1 ...
- 获取Delphi焦点所在的控件及通过控件名称访问控件
方法一: Var I: Integer; Begin For I := To ComponentCount - Do //获取组件数量 Begin If Components[I] Is TWinCo ...
- 错误 1 “Entities.PlanPrjEntity.PlanPrjs”不可访问,因为它受保护级别限制
本人第一次是用List做父类,写了一个类PlanPrjs,如下: class PlanPrj { public int ID { get; set; } public string Name { ge ...
- 如何获取 XAML 控件的模板代码
有时候 .NET 自带提供的控件并不能满足我们的实际需求,需要进行修改,或者参考代码来建立新的控件. 可以在编辑器的文档大纲窗口中,找到所需的对象,然后在其上点右键,编辑模板,编辑副本 弹出创建 St ...
随机推荐
- vue开发常用配置
// src/main.js function setHtmlFontSize() { const baseSize = 100 // 由于浏览器字体最小为12px,故这个值要设置大一点,保证计算所得 ...
- 一段充满bug的R程序,慎入 ...
twitter的AnomalyDetection 官网效果图如下: 尝试写了下面这个R程序: get_specify_df <- function(start_ts,stop_ts,categ ...
- JGUI源码:Tab组件实现(9)
程序界面效果如下 Tab组件由多个TabItem组成,超出部分隐藏,可以通过左右按钮滑动显示出来 1.封装 // 初始化内容 $(function () { J.JTab($(".jgui- ...
- 【ShaderToy】基本操作——旋转
*继续:ShaderToy基础学习中d(`・∀・)b 对每个像素点进行旋转,其实加个公式就ok了啊. 对网格进行旋转: 代码如下: #define TUTORIAL 2 #define PI 3.14 ...
- Bootstrap常用样板
http://blog.csdn.net/Star_449/article/details/76098292 1.图片样式 1.1..img-responsive: 直接为图片添加该样式,可以实现响应 ...
- 多个div实现随意拖拽功能
鼠标事件 mousedownmousemovemouseup注意事项:被拖动的div的position属性值一定是absolute.切记不可使用margin-top:10px;而应该使用top:10p ...
- 查询sql 索引
SELECT indexname = a.name , tablename = c. name , indexcolumns = d .name , a .indidFROM sysindexes a ...
- PyTorch安装
0 - 步骤 参考官网,选择好环境配置按照给定命令安装即可. 1 - 参考资料 https://pytorch.org/
- Linux查看日志工具
⒈journalctl journalctl是Centos7才有的工具用于systemd统一管理所有unit的启动日志,只用一个journalctl命令就可以查看所有的日志(包括内核日志和应用日志), ...
- FreeRTOS如何结束和重新启动调度程序
大多数主机或桌面系统(比如Linux,Mac或Windows)都有一个正常的用例,你可以在早上启动操作系统,然后在晚上关闭它,然后你就离开机器.嵌入式系统是不同的:他们没有参加,他们应该“永远”运行. ...