WPF 自定义泛型用户控件后跨程序集继承用户控件的解决方案
自定义泛型用户控件:
<UserControl x:Class="ClassLibrary1.UcEumCmb"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:ClassLibrary1"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<Grid DataContext="{Binding ElementName=parent}">
<ComboBox Name="cmb2" SelectedItem="{Binding SelectedEnumValue}" />
</Grid>
</UserControl>
public abstract partial class UcEumCmb : UserControl
{ } /// <summary>
/// UcEumCmb.xaml 的交互逻辑
/// </summary>
public class UcEumCmb<T> : UcEumCmb where T : struct
{
public UcEumCmb()
{
InitializeComponent();
// this.LoadViewFromUri("/ClassLibrary1;component/UcEumCmb.xaml");
foreach (Enum enumValue in Enum.GetValues(typeof(T)))
{
cmb2.Items.Add(enumValue);
}
}
public T SelectedEnumValue
{
get { return (T)GetValue(SelectedEnumValueProperty); }
set { SetValue(SelectedEnumValueProperty, value); }
} public static readonly DependencyProperty SelectedEnumValueProperty =
DependencyProperty.Register("SelectedEnumValue", typeof(T), typeof(UcEumCmb<T>), new FrameworkPropertyMetadata { BindsTwoWayByDefault = true });
}
然后声明一个用户控件类,继承即可
public class DayOfWeekSelectorExt2 : UcEumCmb<DayOfWeek> { }
以上参考了:
https://stackoverflow.com/questions/3811179/wpf-usercontrol-with-generic-code-behind
但是,当我们需要自定义泛型T用户控件的时候,大部分情况就是为了分离泛型T类库和用户控件类库之间的依赖,所以一般
DayOfWeekSelectorExt2 : UcEumCmb<DayOfWeek>
会放在主程序里去做
但是这会导致vs编辑器报错提示
不具有由 URI“/ClassLibrary1;component/uceumcmb.xaml”识别的资源。
直接运行也会报错
根据相关资料
1 https://blog.csdn.net/lishuangquan1987/article/details/123347719 (Wpf BUG:组件“XXX”不具有由 URI“XXX“识别的资源)
2 https://www.cnblogs.com/lindexi/p/16714348.html (dotnet 读 WPF 源代码笔记 为什么自定义的 UserControl 用户控件不能跨程序集继承)
3 https://stackoverflow.com/questions/7646331/the-component-does-not-have-a-resource-identified-by-the-uri
需要手动去load usercontrol对应的xaml解决方案如下:
public static class Extensions
{
public static void LoadViewFromUri(this FrameworkElement userControl, string baseUri)
{
try
{
var resourceLocater = new Uri(baseUri, UriKind.Relative);
var exprCa = (PackagePart)typeof(Application).GetMethod("GetResourceOrContentPart", BindingFlags.NonPublic | BindingFlags.Static).Invoke(null, new object[] { resourceLocater });
var stream = exprCa.GetStream();
var uri = new Uri((Uri)typeof(BaseUriHelper).GetProperty("PackAppBaseUri", BindingFlags.Static | BindingFlags.NonPublic).GetValue(null, null), resourceLocater);
var parserContext = new ParserContext
{
BaseUri = uri
};
typeof(XamlReader).GetMethod("LoadBaml", BindingFlags.NonPublic | BindingFlags.Static).Invoke(null, new object[] { stream, parserContext, userControl, true });
}
catch (Exception)
{
//log
}
}
}
public UcEumCmb()
{
//InitializeComponent();
this.LoadViewFromUri("/ClassLibrary1;component/UcEumCmb.xaml");
foreach (Enum enumValue in Enum.GetValues(typeof(T)))
{
cmb2.Items.Add(enumValue);
}
}
取消 InitializeComponent,改为手动load
项目编译运行均正常,
<StackPanel Grid.Row="1" VerticalAlignment="Center" HorizontalAlignment="Center" >
<TextBlock Text="{Binding DayOfWeek,StringFormat=You have selected {0}!}" />
<uc:DayOfWeekSelectorExt2 SelectedEnumValue="{Binding DayOfWeek}" Margin="0,5,0,0" />
<local:DayOfWeekSelectorExt3 SelectedEnumValue="{Binding DayOfWeek}" Margin="0,5,0,0" />
</StackPanel> using ClassLibrary1; namespace EnumSelector
{
public class SomeViewModel // TODO implement INotifyPropertyChanged to support all binding scenarios
{
public DayOfWeek DayOfWeek { get; set; }
} public class DayOfWeekSelector : EnumComboBox<DayOfWeek> { }
public class DayOfWeekSelectorExt : UserControl1<DayOfWeek> { }
public class DayOfWeekSelectorExt3 : ClassLibrary1.UcEumCmb<DayOfWeek> {
WPF 自定义泛型用户控件后跨程序集继承用户控件的解决方案的更多相关文章
- oracle在不知道用户密码的时候,怎么样跳转到另外一个用户执行操作后并不影响该用户?
我们通过如下的方法,可以安全使用该用户,然后再跳转回来,在某些时候比较有用 需要Alter user权限或DBA权限: SQL> select password from dba_users w ...
- 在Winform界面使用自定义用户控件及TabelPanel和StackPanel布局控件
在很多时候,我们做一些非常规化的界面的时候,往往需要创建一些用户控件,在其中绘制好一些基础的界面块,作为后续重复使用的一个单元,用户控件同时也可以封装处理一些简单的逻辑.在开发Winform各种类型项 ...
- WPF中窗口控件的跨线程调用
在WinForm中,我们要跨线程访问窗口控件,只需要设置属性CheckForIllegalCrossThreadCalls = false;即可. 在WPF中要麻烦一下,同样的不允许跨线程访问,因为没 ...
- WPF 自定义ComboBox样式,自定义多选控件
原文:WPF 自定义ComboBox样式,自定义多选控件 一.ComboBox基本样式 ComboBox有两种状态,可编辑和不可编辑状态.通过设置IsEditable属性可以切换控件状态. 先看基本样 ...
- WPF自定义分页控件,样式自定义,简单易用
WPF自定义分页控件 做了许久伸手党,终于有机会贡献一波,搜索一下WPF分页控件,还是多,但是不太通用,主要就是样式问题,这个WPF很好解决,还有一个就是分页控件嘛,只关心几个数字的变动就行了,把页码 ...
- WPF自定义选择年月控件详解
本文实例为大家分享了WPF自定义选择年月控件的具体代码,供大家参考,具体内容如下 封装了一个选择年月的控件,XAML代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ...
- 继续聊WPF——自定义CheckBox控件外观
上一篇文章中谈到了BulletDecorator控件,就是为自定义CheckBox控件的模板做准备,因为CheckBox需要比较严格的布局,正好,BulletDecorator控件就合适了,该控件的布 ...
- WPF自定义LED风格数字显示控件
原文:WPF自定义LED风格数字显示控件 版权声明:本文为博主原创文章,转载请注明作者和出处 https://blog.csdn.net/ZZZWWWPPP11199988899/article/de ...
- 【C#】wpf自定义calendar日期选择控件的样式
原文:[C#]wpf自定义calendar日期选择控件的样式 首先上图看下样式 原理 总览 ItemsControl内容的生成 实现 界面的实现 后台ViewModel的实现 首先上图,看下样式 原理 ...
- WPF 自定义UI控件学习
最近项目中运用到了WPF处理三维软件,在C/S结构中WPF做UI还是有很多优越性,简单的学了一点WPF知识,成功的完成项目目标.项目过度阶段对于WPF的一些基本特点有了进一步了解 .至此花费一点时间研 ...
随机推荐
- [Go] 浅谈 Golang struct 与 PHP class 的相似
Golang 中的 struct 与 PHP 的 class 在使用方式上差不多. struct 中的成员可以类比 class 中的属性,struct 中的成员函数可以类比 class 中的方法. 对 ...
- dotnet 使用 windbg 运行脚本方式自动批量调试处理 dump 文件
本文将和大家介绍一个简单且实际用途不大的使用 windbg 配合脚本的方式,进行自动化的大批量对 dotnet 系应用的 dump 进行自动化分析调试处理,可以自动根据调试需求输出 dump 文件的一 ...
- GitHub 的 Action 判断仅在主仓库才执行脚本
我有一个 GitHub 项目,这个项目配置了仅需要在源仓库才能执行的 Action 如推送 NuGet 等发布动作.如何在 Action 里面设置让 Fork 的仓库不执行 Action 的步骤 想要 ...
- 优秀的 RocketMQ 可视化管理工具 GUI 客户端
优秀的 RocketMQ 可视化管理工具 GUI 客户端 官网地址:http://www.redisant.cn/rocketmq 快速查看所有 RocketMQ 集群,包括Brokers.Topic ...
- Prometheus+Grafana+alertmanager构建企业级监控系统(一)
一.环境准备 k8s集群角色 IP 主机名 配置 控制节点 192.168.199.131 master centos7.9 4核6G 工作节点 192.168.199.128 monitor cen ...
- CCE云原生混部场景下的测试案例
本文分享自华为云社区<CCE云原生混部场景下在线任务抢占.压制离线任务CPU资源.保障在线任务服务质量效果测试>,作者:可以交个朋友. 背景 企业的 IT 环境通常运行两大类进程,一类是在 ...
- blazor中的PageTitle输出keywords和description,自定义组件
在blazor的PageTitle中不具备输出keywords和description的功能,而如果直接使用<mate>标签,输出中文时会变成乱码,所以我给大家推介下面的代码解君愁: 1 ...
- lodash中的深拷贝方法cloneDeep()
- linux 系统tar文件压缩打包命令
打包成tar.gz格式压缩包 # tar -zcvf renwolesshel.tar.gz /renwolesshel 解压tar.gz格式压缩包 # tar zxvf renwolesshel.t ...
- gin-vue-admin 03 项目打包上线
目录 作者视频 思路 环境要求 1. 配置nginx 2.打包前台vue代码 3.打包后台go代码 4. 上传代码到服务器 5. 后台运行power 6. 访问后台 开发场景: 1. nginx 配置 ...